https://www.acmicpc.net/problem/10808

 

10808번: 알파벳 개수

단어에 포함되어 있는 a의 개수, b의 개수, …, z의 개수를 공백으로 구분해서 출력한다.

www.acmicpc.net

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String input = sc.next();
        String a = "abcdefghijklmnopqrstuvwxyz";
        int[] cnt = new int[a.length()];
        for(int i = 0; i < input.length(); i++){
            for(int j = 0; j < a.length(); j++){
                if(input.charAt(i) == a.charAt(j)){
                    cnt[j] += 1;
                }
            }
        }
        for(int i = 0; i < cnt.length; i++){
            System.out.print(cnt[i] + " ");
        }
    }


}

 

- 아스키코드로 푸는 문제라는데 실전에서 그걸 내가 기억할 수 있을가 싶다..

- String a에 알파벳 a ~ z까지 넣고 String의 charAt 함수를 이용해서 일일이 문자 대조 가능

 

 

https://www.acmicpc.net/problem/1475

 

1475번: 방 번호

첫째 줄에 다솜이의 방 번호 N이 주어진다. N은 1,000,000보다 작거나 같은 자연수이다.

www.acmicpc.net

 

import java.util.Scanner;

import static java.lang.Math.max;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        int[] arr = new int[10];

        while(num > 0){
            arr[num%10] += 1;
            num /= 10;
        }

        int ans = 0;
        for(int i = 0; i < 10; i++){
            if(i == 6 || i == 9) continue;
            ans = max(ans, arr[i]);
        }
        ans = max(ans, ((arr[6]+arr[9]+1))/2);
        System.out.println(ans);
    }


}

 

- 나머지로 각 자리 숫자 구하기

- 해당 숫자가 몇 개씩 있는지 카운트해서 배열에 저장

- 가장 많은 숫자만큼 카드 세트가 필요한데, 6과 9는 대체될 수 있으므로 따로 카운트함.

 

 

https://www.acmicpc.net/problem/3273

 

3273번: 두 수의 합

n개의 서로 다른 양의 정수 a1, a2, ..., an으로 이루어진 수열이 있다. ai의 값은 1보다 크거나 같고, 1000000보다 작거나 같은 자연수이다. 자연수 x가 주어졌을 때, ai + aj = x (1 ≤ i < j ≤ n)을 만족하는

www.acmicpc.net

 

import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {

    static int N, X;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine());
        int[] arr = new int[N];
        for(int i = 0; i < N; i++){
            arr[i] = Integer.parseInt(st.nextToken());
        }
        X = Integer.parseInt(br.readLine());

        Arrays.sort(arr);

        int s = 0; int e = N-1; int sum = 0; int ans = 0;

        while(s < e){
            sum = arr[s] + arr[e];
            if(sum == X) ans++;
            if(sum <= X) s++;
            else e--;
        }

        br.close();
        System.out.print(ans);

    }


}

 

 

이전 풀이 : 런타임에러 발생

import java.io.*;
import java.util.StringTokenizer;

import static java.lang.Math.*;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine());
        int[] arr = new int[1000001];
        for(int i = 0; i < n; i++){
            arr[Integer.parseInt(st.nextToken())] += 1;
        }

        int comp = Integer.parseInt(br.readLine());
        int ans = 0;
        for(int i = 1; i < 1000000; i++){
            if(comp - i > 0) {
                if(arr[comp - i] != 0 && arr[i] != 0) ans++;
            } else{
                break;
            }
        }
        // 1 2 3 5 7 9 10 11 12

        System.out.println(ans/2);

    }


}

 

nohup java -jar your_application.jar &

 

nohup 이라는 명령어를 앞에 붙여주고 마지막에는 &를 붙여주면 된다.

nohup = no hang up

 

단, nohup 명령어를 붙였을 때 실행하려는 파일이 755 permission을 가지고 있어야 한다.

permission없으면 실행 안 됨.

 

 

chmod를 사용한 권한 부여방법

모든 권한 읽기, 쓰기, 실행을 부여

sudo -s // root 권한 얻기
chmod -R 777 filename

 

 

nohup과 &(백그라운드)의 차이

nohup

프로그램의 데몬의 형태로 실행시키므로 로그아웃으로 세션이 종료되더라도 프로그램 유지.

&(백그라운드)

단지 프로그램을 사용자의 눈에 보이지 않는 백그라운드 형태로 돌리고 있기 때문에 로그아웃으로 세션과 연결이 끊어지면 실행되고 있던 프로그램도 함께 종료.

어떤 프로그램을 종료없이 백그라운드에서 실행하고 싶으면 "nohup + &" 조합으로 실행하는 것이 가장 안전.

 

 

프로세스 종료

ps 명령어로 프로세스 아이디를 알아내고, kill 명령어로 프로세스 종료

 

 

🚫 문제 상황

웹소켓 서버를 파이썬 서버로 해서 스프링 기반의 클라리언트에서 파이썬 서버로 동영상을 전달하려고 함.

그런데 파이썬 서버측 웹소켓이 open connection하자마자 close하는 문제가 발생.

골치 아팠던건 open이 유지될 때도 있고, open하자마자 close되는 경우도 있고 랜덤으로 상황이 나타나는 것.

 

❗️ 문제 원인 & 💊 해결

파이썬 웹소켓 서버 코드에 있었다...

import asyncio
import base64
import cv2
import numpy as np
import websockets 
import AI_function_img


async def handler(websocket):
    while True:
        data = await websocket.recv()
        img = cv2.imdecode(np.frombuffer(base64.b64decode(data.split(',')[1]), np.uint8), cv2.IMREAD_COLOR)
        result = AI_function_img.handle(img)
        if result != None and len(result) > 0:
          await websocket.send(result)


async def main():
    async with websockets.serve(handler, "172.31.11.131", 9999):
      await asyncio.Future()  # run forever


if __name__ == "__main__":
    asyncio.run(main())

웹소켓이 연결되어서 이미지 자료를 전달받고 우리가 만든 인공지능이 이미지 classification하는 동안 return이 None인 찰라의 시간이 발생하는데, 이때 websocket.send(result)를 해버리면 error가 발생해서 웹소켓이 자동으로 close된 것.

그래서 웹소켓이 클라이언트로 result를 전달하기 전에 null check를 해주는 코드를 추가했더니 문제가 해결됐다.

🚫 문제 상황

JS에서 video태그를 사용해서 webcam을 실행하고 이를 파이썬 서버로 보내는 기능을 구현하려고 함.

그런데 localhose에서는 카메라가 잘 작동했는데 프로젝트를 NCP에 올리고 public ip로 접속하니 제목에 명시한 에러 발생.

 

❗️ 문제 원인

localhost 는 http 도 보안 출처로 간주하지만, 출처가 다른 곳에서 접속할때는 SSL/TLS 인증서가 필요함.

내 PC의 카메라/마이크에 접근을 하려고 할 때, 이때 이 서버에 인증서가 있는지 확인을 하게 되는데,

이 서버의 URL이 https 가 아니면 

이렇게 표시가 되고, Media 에 접근 할 수 없음.

 

💊 해결 방법 1 : 서버에 인증서 설치

비용 발생. 실제 서비스를 해야 할 일이 있다면 ssl 인증서를 발급 받아 서버에 설치해야 함.

 

💊 해결 방법 2 : 일시적

테스트가 목적이므로 url에 접속할 pc에서 진행해주면 됨.

 

1 ) 크롬 브라우저에서 아래 주소 입력

chrome://flags

 

2) 상단 search 입력란에 Insecure origins treated as secure 입력. 

    그리고 아래와 같이 접속 할 서버 ip 를 입력  Enable 시키고 브라우저를 다시 시작.

 

3) 그리고 다시 서버 주소로 접속하면, 카메라에 권한이 있는 것을 확인 가능.

 

 

📌 출처

https://hello-bryan.tistory.com/467

 

[Javascript] cannot read properties of undefined (reading 'getUserMedia') 해결하기

cannot read properties of undefined (reading 'getUserMedia') WebRTC 로 클라이언트와 서버 간 영상 전송을 하고 있었습니다. 처음에는 같은 PC 에서 서버와 클라언트를 실행해서 잘 됐지만, 서버를 따로 두고 다

hello-bryan.tistory.com

 

Simple TensorFlow Regression : MPG

We will see if we can predict the miles per gallon (MPG) for a car based on the car's weight, cylinders, engine size, and other features.

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation
import pandas as pd
import io
import os
import requests
import numpy as np
from sklearn import metrics

df = pd.read_csv(
    "https://data.heatonresearch.com/data/t81-558/auto-mpg.csv", 
    na_values=['NA', '?'])

cars = df['name']

# Handle missing value
df['horsepower'] = df['horsepower'].fillna(df['horsepower'].median())

# Pandas to Numpy
x = df[['cylinders', 'displacement', 'horsepower', 'weight',
       'acceleration', 'year', 'origin']].values
y = df['mpg'].values # regression

# Build the neural network
model = Sequential()
model.add(Dense(25, input_dim=x.shape[1], activation='relu')) # Hidden 1
model.add(Dense(10, activation='relu')) # Hidden 2
model.add(Dense(1)) # Output
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(x,y,verbose=2,epochs=100)

 

Introduction to Neural Network Hyperparameters

Parameter vs Hyperparameter

  • Parameter : 모델 내부에 존재하는 매개변수. 학습의 대상.
  • Hyperparameter : 경험, 데이터의 특성 등에 근거하여 사용자가 설정하는 값. ex) learning rate

 

model.add(Dense(25, input_dim=x.shape[1], activation='relu')) # Hidden 1
  • input_dim : the number of inputs the dataset has. The network needs one input neuron for every column in the data set (including dummy variables).
  • x.shape[1] : the number of columns of dataset x
  • 25 : the number of neurons in the hidden layer
    • 몇 개의 hidden layer를 가질지, 각각의 layer에는 몇 개의 neuron이 필요할지 결정하는 것은 hyperparameter에 해당하기 때문에 정답이 없음.

 

model.add(Dense(1)) # Output

Regression neural network는 항상 1개의 output만을 가지므로 마지막 레이어는 이렇게 설정

 

 

model.compile(loss='mean_squared_error', optimizer='adam')

loss : regression neural network에서는 항상 'mean_squared_error' 사용

optimizer : 이 수업에서는 주로 'adam' 사용

 

 

model.fit(x,y,verbose=2,epochs=100)

verbose

 

  • verbose=0 - No progress output (use with Jupyter if you do not want output).
  • verbose=1 - Display progress bar, does not work well with Jupyter.
  • verbose=2 - Summary progress output (use with Jupyter if you want to know the loss at each epoch).

epochs : neural network 트레인 횟수. 트레인이 진행될수록 loss가 줄어드는 것을 확인할 수 있음.

 

 

 

Simple TensorFlow Classification : Iris

import pandas as pd
import io
import requests
import numpy as np
from sklearn import metrics
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation
from tensorflow.keras.callbacks import EarlyStopping

df = pd.read_csv(
    "https://data.heatonresearch.com/data/t81-558/iris.csv", 
    na_values=['NA', '?'])

# Convert to numpy - Classification
x = df[['sepal_l', 'sepal_w', 'petal_l', 'petal_w']].values
dummies = pd.get_dummies(df['species']) # Classification
species = dummies.columns
y = dummies.values


# Build neural network
model = Sequential()
model.add(Dense(50, input_dim=x.shape[1], activation='relu')) # Hidden 1
model.add(Dense(25, activation='relu')) # Hidden 2
model.add(Dense(y.shape[1],activation='softmax')) # Output

model.compile(loss='categorical_crossentropy', optimizer='adam')
model.fit(x,y,verbose=2,epochs=100)
model.add(Dense(y.shape[1],activation='softmax')) # Output

category 수만큼 output 발생해야 하고, classification neural network이므로 activation='softmax'

 

model.compile(loss='categorical_crossentropy', optimizer='adam')

category가 2개 이상일 경우 loss='categorical_crossentropy' 사용

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/42891

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

  • (heap[0][0] - previous)  * length : 현재 음식 먹는 시간 * 남은 음식 갯수 = 현재 음식을 다 먹는데 걸리는 시간 
  • heap[0][0] - previous : 현재 음식 먹는 시간을 구할 때 이전에 먹는데 걸린 시간을 빼줘야 함. 왜냐면 그만큼 시간이 흘렀으니까.
  • 이 부분 떠올리는게 어려웠음

 

import heapq
def solution(food_times, k):
    heap = []
    
    if sum(food_times) <= k:
        return -1
    
    for i in range(len(food_times)):
        heapq.heappush(heap, (food_times[i], i+1))
        
    sum_val = 0 # 먹기 위해 사용한 총 시간 
    previous = 0    # 직전에 먹는데 걸린 시간
    length = len(food_times)
    
    # 직전에 다 먹은 시간을 heap[0][0]에서 빼줘야 함. 
    # 왜냐면 그만큼 시간이 흘렀으니까.
    # 현재 음식 먹는 시간 * 남은 음식 갯수 = 현재 음식을 다 먹는데 걸리는 시간 
    while sum_val + ((heap[0][0] - previous)) * length <= k:
        now = heapq.heappop(heap)[0]
        sum_val += (now - previous) * length
        length -= 1 # 남은 음식 수 조정 
        previous = now 
        
    # result에는 남은 음식 배열만 담기게 됨 
    # index순으로 정렬 
    result = sorted(heap, key = lambda x : x[1])
    # 남은 음식 중에서 몇 번째 음식인지 확인하여 출력 
    return result[(k-sum_val)%length][1]

'◦ Algorithm > Python' 카테고리의 다른 글

백준 2xn 타일링 2 DP  (0) 2023.05.24
프로그래머스 두 큐 합 같게 하기  (0) 2023.05.22
백준 스타트와 링크 14889 완전탐색  (0) 2023.05.14
백준 퇴사 14501 DP  (0) 2023.05.14
백준 로봇 조종하기 2169 DP  (0) 2023.05.09

+ Recent posts