728x90

문제


https://programmers.co.kr/learn/courses/30/lessons/12906?language=javascript 

 

코딩테스트 연습 - 같은 숫자는 싫어

배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은

programmers.co.kr

 

코드


function solution(arr) {
    let answer = [];
    for (let i=0; i<arr.length; i++) {
        if (arr[i] !== arr[i+1]) answer.push(arr[i]); //배열의 원소가 다음 인덱스 원소와 같지 않다면 정답에 push
    }
    return answer;
}

 

후기


  • 배열의 성질을 이용하여 쉽게 풀 수 있는 문제였다
  • 다른 분의 멋진 풀이를 보니 filter() 함수를 이용하여 한 줄 풀이를 하였다
  • function solution(arr)
    {
        return arr.filter((val,index) => val != arr[index+1]);
    }
728x90

문제


https://programmers.co.kr/learn/courses/30/lessons/42888?language=javascript 

 

코딩테스트 연습 - 오픈채팅방

오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오

programmers.co.kr

 

코드


function solution(record) {
    let answer = [];
    let user = {}; //userid, nickname을 담을 user객체
    
    //message[0] = message, message[1] = userid, message[2] = nickname
    for (let i=0; i<record.length; i++) {
        let message = record[i].split(" "); //record의 각 문장을 단어별로 잘라서 배열에 담기
        if (message[0] === "Enter" || message[0] === "Change") { //다시들어오는 경우라도 이 코드를 통해 닉네임이 새로 갱신됨
            user[message[1]] = message[2]; //userid: nicknmae <<이렇게 저장됨
        }
    }
    
    for (let i=0; i<record.length; i++) {
        let message = record[i].split(" ");
        if (message[0] === "Enter") { //객체에 저장된 userid의 nickname을 불러와서 출력
            answer.push(`${user[message[1]]}님이 들어왔습니다.`);
        }
        else if (message[0] === "Leave") {
            answer.push(`${user[message[1]]}님이 나갔습니다.`);
        }
    }

    return answer;
}

 

후기


  • 처음에 문제 접근을 잘못해서 한참을 헤맸다. 문제는 결국 최종적으로 찍히는 메시지만 출력하면 되는데 한명 한명 들어오고 나갈때마다 메시지를 출력해서 수정을 해나가는 방식으로 처음에 로직을 짰기 때문에 다시 들어오는 경우에 닉네임을 수정하는 과정이 까다로웠다
  • 결국 문제는 마지막에 메시지를 출력하면 되는 것이니 출력은 가장 나중으로 두고 풀었다. 객체와 배열의 성질을 잘 이용해서 userid, nickname의 정보를 담고 update도 동시에 가능하게 했다
  • 로직을 수정하고 나서는 꽤 수월하게 풀었지만 다른 분들의 풀이를 보니 map을 사용하여 푼 풀이가 많았다. 나는 아직 map에 익숙하지 않아서 그런지 봐도 이해가 잘 안됐다ㅜ.. 문법 공부를 좀 더 해야겠다!
728x90

문제


https://programmers.co.kr/learn/courses/30/lessons/42889?language=javascript 

 

코딩테스트 연습 - 실패율

실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스

programmers.co.kr

 

코드


function solution(N, stages) {
    let answer = [];
    let tmp = [];
    let b = stages.length; //n번째 스테이지에 도달한 사람

    stages.sort((a,b) => (a-b)); //stages배열 오름차순 정렬

    for (let i=1; i<N+1; i++) { //stage는 1부터 시작이니 i=1부터
        let a = stages.reduce((count, element) => count + (i === element), 0); //n번째 스테이지에 도달했지만 성공하지 못한 사람
        tmp.push([i, failure(a,b)]); //실패율 구하고 tmp에 각 스테이지와 실패율 push
        b = b-a; //배열 전체 길이에서 n번째 스테이지에 도달만 한 사람들 빼주기
    }
    
    tmp.sort((a, b) => b[1]-a[1]); //실패율 내림차순에 따라 배열 정렬
    for (let i=0; i<tmp.length; i++) { //내림차순 정렬된 tmp의 스테이지를 answer에 push
        answer.push(tmp[i][0]);
    }
    
    function failure(a,b) { //실패율 함수
        return a/b;
    }
    return answer;
}

 

후기


  • 배열을 잘 이용하면 쉽게 풀 수 있는 문제였다
  • 로직을 어떻게 짜냐에 따라 다양한 코드가 나오는 것을 알 수 있는 문제였다
  • 내 풀이에서 길이를 좀 줄이려면 굳이 함수를 안 만들어도 됐을 것 같다
728x90

문제


https://programmers.co.kr/learn/courses/30/lessons/68644

 

코딩테스트 연습 - 두 개 뽑아서 더하기

정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요. 제한

programmers.co.kr

 

코드


function solution(numbers) {
    let tmp = [];
    let answer = [];
    const len = numbers.length;
    let sum = 0;

    for (let i=0; i<len; i++) { //배열에서 서로다른 두 수를 뽑아
        for (let j=i+1; j<len; j++) {
            sum = numbers[i]+numbers[j];
            tmp.push(sum); //더한 값을 tmp에 push
        }
    }

    tmp.forEach((i) => { //tmp 배열의 중복을 제거하여 answer에 push
        if (!answer.includes(i)) {
            answer.push(i);
        }
    });

    answer.sort(function(a, b) { //answer 배열 오름차순 정렬
        return a-b;
    });

    return answer;
}

 

후기


  • 문제를 보자마자 이중 for문을 통해 각 자리별 sum을 배열에 담아 중복을 제거하고 정렬해야겠다고 생각했다
  • 중복을 제거하는 과정에서 불필요하게 코드가 길어진 게 아쉬웠다
  • 왜냐하면 다른 분의 풀이에서는 밑의한줄로 끝내버렸기 때문
  • const answer = [...new Set(temp)]
     
  • 이 코드에서 뿐만 아니라 배열에 관련된 문제를 풀 때 다른 분들의 풀이를 보면 종종 '...' 문법을 쓰는 것을 볼 수 있었다. 이참에 찾아보았는데, '...'은 쉽게 말해 바로 뒤에나오는 변수 등의 '전체'를 의미한다
  • ex) const a = [1,2,3]; 일 때, const b = [...a,4,5]; 이면, b = [1,2,3,4,5]가 된다
  • 정렬을 할 때도, asnwer.sort() 만 했었는데, 자바스크립트에서는 sort()안에 어떠한 조건을 주지 않으면 기본적으로 유니코드에 따라 오름차순 정렬이 된다는 것을 알았다. 그래서 내가 원하는 진짜 오름차순을 하기 위해서는 위와 같은 조건이 필요했다

+ Recent posts