코딩 테스트 in JS

프로그래머스 JS 코테 | 같은 숫자는 싫어, 폰켓몬

바닷가쟤 2023. 8. 29. 13:04

오늘은 그룹 스터디에서 두 분이 스택/큐 문제를 가지고 오셨다.

그래서 감명을 받고 나도 강의를 듣고 같은 숫자는 싫어 문제부터 풀어 보았다.

(사실 강의를 들어도 활용은 잘 모르겠고 그냥 풀었던 것 같다... 다른 강의 찾아봐야징..)

폰켓몬은 문제는 길지만 나름 괜찮았다.

오늘 푼 문제 궁합이 좋은 것 같다. 같은 숫자는 싫어에서 배운 내용을 폰켓몬에서 활용했다..!!!

이제 1단계 어려운 문제와 2단계도 슬슬 풀어봐야겠다.


Lv.1 같은 숫자는 싫어

같은 숫자는 싫어

배열 answer를 만들고, arr를 하나씩 순회해서 값이 들어간 값과 비교해서 일치하면 넘어가고 다르면 answer 배열에 넣는 방식으로 해보자.

첫 번째 시도

function solution(arr) {
    const answer = [];
    let a = 0
    for (let i = 0; i <= arr.length - 1; i++) {
        if(a !== arr[i]) {
            a = arr[i]
            answer.push(arr[i])
        }
    }
    return answer
}

개같이 실패

그냥 갑자기 테스트 케이스 통과길래 제출해봤는데 개같이 실패(당연함)

나도 코드를 다 안 짰다고 생각했는데 … ㅋㅋㅋㅋ

 

두 번째 시도 : 성공은 함

function solution(arr) {
    const answer = [];  // 정답 배열 생성
    let a = 0  // arr[i] 할 변수
    answer.push(arr[0])  // 첫 번째 숫자 할당(이건 겹치지 않으니까)
    for (let i = 1; i <= arr.length - 1; i++) { 
        if(arr[i - 1] !== arr[i]) {  // arr[i] - 1 (전 숫자)와 arr[i] 를 비교
            a = arr[i]  // a 변수에 arr[i]를 할당해서 
            answer.push(a)  // answer에 a를 push
        }
    }
    return answer
}

근데 너무 지저분 한 것 같다..

조금 다듬어 보자..

function solution(arr) {
    const answer = [];
    answer.push(arr[0])
    
    for (let i = 1; i <= arr.length - 1; i++) {
        let a = 0
        if(arr[i - 1] !== arr[i]) answer.push(a = arr[i])
    }
    return answer
}

일단 이렇게 까지 했다..

 

다른 사람 풀이

function solution(arr) {
    return arr.filter((val,index) => val != arr[index+1]);
}

다른 사람 풀이 누르자 마자 육성으로 와우 해버림

어이가 없네요

filter 다음에 써보자…

function solution(arr) {
    const answer = [arr[0]];

    for (let i=1; i<arr.length; i++) {
        if (answer[answer.length - 1] !== arr[i]) {
            answer.push(arr[i]);
        }
    }
    return answer;
}

근-본 이라는데 answer배열에다가 arr[0]을 미리 넣어두면…. 됐네… 나는 멍청이

 


Lv. 1 폰켓몬

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

폰켓몬

문제 짱 길다..

그치만 이해는 해서 풀 수 있을 것 같다.

길이 / 2 값을 추출할 포켓몬 갯수로 해서 ..(일단 변수로 만들어놓고 겹치지 않는 포켓몬을 이 변수의 갯수만큼 자른다)

배열에서 수를 최대한 겹치지 않게 (filter 써보자) 뽑아서

뽑은 종류의 수를 반환하면 될 것 같다.

일단 nums 배열에서 겹치지 않는 수를 추출해보자.

정렬을 해줘야 숫자가 겹치지 않기 때문에 정렬 후 filter로 안 겹치는 수를 추출해야한다.

function solution(nums) {
    return nums.sort().filter((num, index) => num !== nums[index + 1]);
}

이런 방식으로 겹치지 않는 숫자 배열을 반환할 수 있다.

이걸 sortNums변수에 저장하겠다.

여기서 해야할건, nums의 길이 / 2 수와 sortNums변수를 비교해서

  • nums의 길이 / 2sortNums 보다 크면 sortNums의 길이 를 출력하고,
  • nums의 길이 / 2sortNums 보다 작으면 nums의 길이 /2를 출력하면 될 것 같다.
function solution(nums) {
    const sortNums = nums.sort().filter((num, index) => num !== nums[index + 1]).length;
    const getPoketmon = nums.length / 2
    
    return getPoketmon > sortNums ? sortNums : getPoketmon
}

성공 !!

뭔가 뿌듯한 풀이였다.

728x90