내일배움캠프 Node.js 본캠프 57일차

김선우·2024년 10월 30일
post-thumbnail

알고리즘 문제 풀어보기

괄호 회전하기

문제 설명

다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.

(), [], {} 는 모두 올바른 괄호 문자열입니다.
만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, {} 와 ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.
대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.

제한사항

s의 길이는 1 이상 1,000 이하입니다.

풀이 코드

function solution(s) {
    var answer = 0;
    var stack = [];
    var isCorrect = true;
  
    if (s.length % 2 === 1) return 0;
    
    for(i=0; i<s.length; i++){       
       var str = s.slice(i) + s.slice(0,i);
       isCorrect = true;
      
        for(n of str){
            if(n === "[" || n === "{" || n === "(" ){
                stack.push(n);
            }else{
                var opening = stack.pop();
                if (opening === "(" && n === ")") continue;
                if (opening === "{" && n === "}") continue;
                if (opening === "[" && n === "]") continue;
              	isCorrect = false;
                break;
            };
        };
      
        if (isCorrect) answer++;
    };
    return answer;
};

풀이 과정

확인을 위해 값을 넣어줄 stack, 짝이 맞는 경우를 확인해줄 isCorrect 생성. 만약 주어진 문자열이 홀수인 경우에는 바로 0을 리턴해준다. 문자열을 계속 왼쪽으로 한 칸씩 회전하도록 반복문을 만들고 또다시 반복문으로 [ , { , ( 인지 확인하는 조건문을 사용해 맞다면 stack에 push해준다. 아니라면 stack에 쌓여있는 데이터중 마지막을 꺼내서 짝이맞는지 확인한다. 이때 짝이 맞으면 계속진행하고, 맞지 않으면 isCorrect를 false로 만들고 break해준다. 이후 짝이 맞으면 answer값을 늘려주고 answer를 리턴해준다.

개인 과제(멀티플레이)

해설 영상을 보고 만들어서 실행하던 중에

const user = gameSession.getUser(userId);
if(!user){
            console.error('user not found');
        }

부분에 해당하는 문제가 발생했다. 곧바로 문제의 부분을 확인하기 위해 위의 gameSession.getUser(userId)를 console.log로 찍어본 결과, 다른값들은 다 정상적으로 들어오는데 user의 id부분이 정의되지않았다.

이번에도 문제를 못찾겠어서 튜터님을 찾아갔는데...

const initialHandler = async ({socket, userId, payload}) => {
    try{
        const { deviceid, latency, playerId} = payload;

        const user = addUser(socket, deviceid, playerId, latency);
        const gameSession = getGameSession();
        gameSession.addUser(user);

        const initialResponse = createResponse(
            HANDLER_IDS.INITIAL, 
            RESPONSE_SUCCESS_CODE, 
            {userId: deviceid,}
        );

        socket.write(initialResponse);
    }catch(e){
        console.error(e);
    }
};

해당 부분의 deviceId의 i가 대문자가 아닌 소문자였다...
initial.proto에서는 대문자로 해놓고... 이러니까 당연히 받아온걸 인식못해서 정의되지 않았다고하지..
이틀 연속으로 오타를 못찾아서 튜터님을 찾아가다니.. 너무 부끄럽다..

모의면접

대답 못한 부분 다시 공부하기

연결 지향형 통신, 비연결형 통신이 무엇인가?

  • 연결 지향형 통신 : 신뢰할 수 있고 데이터를 정확하게 전달하는 통신 방식, 서로 확인하고 요청과 응답을 주고받으면서 통신.
    비연결형 통신 : 효율적으로 데이터를 전송하는 통신 방식, 일방적으로 데이터를 전송.

IP의 한계에서 프로그램 구분 불가능이라는 한계가 존재한다고 했는데 그럼 프로그램 구분을 가능하게 해주는 것은 무엇인가?

  • TCP 계층에서 각 컴퓨터의 포트라는 개념을 도입해 한 IP에서도 포트번호로 프로그램들을 구분지어 여러 프로그램을 구분지어 통신할 수 있게 됨.

혼잡제어

  • 혼잡 = 네트워크 내 패킷의 수가 과도하게 증가하는 현상.
    => 혼잡제어 = 송신측의 데이터 전달과 네트워크 데이터 처리 속도를 해결하기 위한 기법으로 네트워크의 혼잡 현상을 방지하고 송신측에서 보내는 데이터의 전송 속도를 제어하기 위한 기능. 라우터를 포함한 넓은 범위의 전송 문제를 다룸.

로드 밸런싱의 개념

  • 어제 한 답변
    컴퓨터 네트워크 기술의 일종으로 둘 혹은 셋 이상의 중앙처리장치 혹은 저장장치와 같은 컴퓨터 자원들에게 작업(Work), 즉, 부하(Load)를 나누는 것을 의미
    주요기능으로는 부하 분산, 조건에 맞춰 필요시 서버에 컴퓨터 수를 늘리거나 줄여서 부하 관리가 가능하게하는 오토 스케일링, 해당 포트에 트래픽을 보내 어플리케이션이 올바르게 작동하는지 여부를 판별하는 헬스 체크(Health Check) 등이 있다.

위의 취소선 부분이 잘못된 부분이었는데, 해당 부분을 '네트워크 또는 서버에 가해지는 부하 트래픽을 분산시켜주는 기술을 의미.' 라고만 했어도 좋았을 것 같다.

0개의 댓글