코딩 테스트 in JS

JS 코테 - 프로그래머스 1단계! K번째수

바닷가쟤 2023. 8. 6. 17:29

 

정말 감도 안 잡히는 문제였다.

어떤 문젠지는 이해 했고 배열이니까 배열 지식을 총 동원해서 풀면 될 것 같긴 해서 이 문제를 선택했다.

그래서 풀 순 있을 것 같은데...? 풀기 시작하니까 당최 어떻게 접근해야할지 전혀 감이 잡히지 않았다.

결국 풀었긴 함 !! 

역시 0단계 풀던 나에겐 어려웠던 문제라 배운게 참 많다.

 


첫 시도 

function solution(array, commands) {
    const nums = commands.join(','); // ,기준 숫자 출력
    let i = []
    
    return nums;
}

이렇게 하면 nums는 문자열로 "2,5,3,4,4,1,1,7,3"이 출력된다.  --> 다 풀고 생각했는데 flat을 쓸 수 있음..ㅋ

이를 숫자로 바꾸고(실패)

배열 안에 넣어서 

for문으로 i, j, k 배열에 3개씩 할당해서 풀어보려 했으나 실패 !

 

i 는 숫자 % 3 === 0

j 는 숫자 % 3 === 1

k 는 숫자 % 3 === 2

제로 베이스드 넘버링 된거니까 숫자 부분엔 배열 [숫자] 이게 들어가야하는데 어케 빼는지 모르겠어서... 전혀 감이 안 잡힌다... 이게 아닌가보다...

 


두 번째 시도

배열 반복문으로 다 시도해봤다.

for문, for of문, forEach, map...

ㅋㅋㅋ 개같이 실패

function solution(array, commands) {
    // nums1 = commands.shift()
    // nums2 = commands.shift()
    // nums3 = commands.shift()
    let nums;
    for(let num of commands) {
        nums = num
    }
    return nums
}

세 번째 시도

감 잡았으 !!!

그냥 단순하게.. commands[0][0] 하면 될 것 같다!!!

function solution(array, commands) {
    const num = array.slice(2 - 1, 5)
    num.sort()
    const answer = num.slice(3 - 1, 3)
    return answer;
}

요 녀석을 for문으로 만들어야 한다. (실험해본거다! 결과 나와서 이제 나머지 두 개 받게 반복문으로 만들어보자...)


성공

-대강 틀은 잡음 이건 완전 통과는 아니다 1개 실패함..!-

function solution(array, commands) {
    let i = 0
    let j = 1;
    let k = 2;
    const answer = [];
    
    for (let r = 0; r < commands.length; r++) {
        const num = array.slice(commands[r][i] - 1, commands[r][j])
        num.sort()
        answer.push(num.slice(commands[r][k] - 1, commands[r][k])) 
    }

    return answer.flat()
}

3트만에 성공했다...!! 풀이 시간은 1시간 걸렸다..!!!! 

근데 채점하기에서 테스트 2 하나 실패

이유가 뭐지...>??

정확성은 85.7점 나왔다ㅜㅜ 이럴 때는 어케 해야하는거징

 

- 성공 -

function solution(array, commands) {
    const answer = []
    
    for (let i = 0; i < commands.length; i++) {
        const num = array.slice(commands[i][0] - 1, commands[i][1])
        num.sort((a, b) => a - b)
        answer.push(num[commands[i][2] - 1])
    }

    return answer.flat()
}

위에껀 이해하기 쉽게 i, j, k를 설정했지만 숫자로 넣는게 코드가 더 짧아진다.(많이 쓰는 변수도 아니고)

문제는 sort였다. sort에서 a - b로 대소 비교를 해서 작은 것 부터 큰 수로 정렬을 해줘야 한다...

 

sort 와 sort((a, b) => a - b) 의 차이

sort() 메서드는 기본적으로 문자열 기준으로 배열의 요소를 정렬한다.

그래서 정렬을 하면 [19, 8, 5]가 있으면 [19, 5, 8]로 정렬한다.

19의 1을 우선으로 보기 때문이다.

따라서 sort((a, b) => a - b)로 대소비교를 해서 숫자 오름차순 정렬을 하게 만들어 줘야 한다.


역시 어떻게 풀건지 미리 노트에 정리하고 풀어가는 과정에도 정리한게 도움이 되었다. 

하핳

728x90