본문 바로가기
코테연습

52. K번째수 Javascript

by hxunz 2022. 5. 25.

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

 

코딩테스트 연습 - K번째수

[1, 5, 2, 6, 3, 7, 4] [[2, 5, 3], [4, 4, 1], [1, 7, 3]] [5, 6, 3]

programmers.co.kr

 

 

1. 문제에 대한 이해

  • 우리가 풀어야 할 문제는 무엇인가?
     - 배열 array에서 i번째 부터 j 번째까지 자르고 이 새로운 배열을 정렬시킨 다음에 k번째 숫자가 무엇인지 찾아라.
  • 주어진 자료는 무엇인가?
     - array와 i, j, k를 담은 2차원 배열인 commands
  • 조건은 무엇인가?
     - commands의 원소의 길이는 3이다.
  • 숨겨진 조건이나 자료가 있는가? 그렇다면 그 것을 다른 방법으로 해석해보라.
     - 문제에서 배열의 인덱스가 0부터 시작인것을 고려 안해줘서 i-1. j-1. k-1로 바꿔줘야한다.
 
 

2. 계획

  • 이 문제를 푸는데 있어서 유용하게 쓸 수 있는 지식은 무엇인가?
     - i, j번째에 있는 배열의 요소를 찾아야하는것이기 때문에 slice()를 사용할 수 있을것같다.
     - 정렬을 시키는것이 조건이기에 sort()를 사용할 수 있을것이다.
  • 만약 문제를 풀 수 없다면 문제를 더 단순하게 하기 위해서 주어진 조건을 버려보아라
     - 예제 코드의 commands의 길이가 길어서 헷갈릴 수 있으니까 우선, commands안에는 하나의 배열만 있을때라고 가정하고
    코드를 풀어보자
  • 주어진 자료로부터 유용한 것을 이끌어 낼 수 있는가?
     - commands 안에서 배열들 하나씩 확인해봐야하니까 map()을 사용할 수 있을것같다.

첫번째 풀이 계획

1. commands[0]을 firstArr라는 변수에 할당 (2차원 배열에서 벗어나야겠다고 생각했음). 

2. array를 firstArr의 0번째 인덱스에서 -1을 한 인덱스부터 ~ firstArr의 1번째 인덱스까지 slice()를 한다.

3. 그리고 이것을 sort()를 사용하여 정렬한다.

4. firstArr의 2번째 인덱스에서 -1을 한 인덱스를 이렇게 해서 나온 배열내에서 찾아본다.

5. 그리고 이 숫자를 배열 안에 넣어서 리턴해준다.

 

두번째 풀이 계획

1. 결과 값을 담을 result라는 변수를 만들어준다. 그리고 여기에 값을 넣어줄거다.

2. commands에 map()함수를 적용했다.

3. 그리고 이 안에 arr라는 변수를 만들어줬다.

4. arr라는 변수에는 array를 commands의 요소인 num[0]-1 부터 ~ num[1]까지 slice()한다.

5. 그리고 이것을 sort()를 사용해서 정렬해준다.

6. arr의 num[2]-1번째 인덱스를 찾아서 리턴해준다.

7. 이 값들이 처음에 설정해둔 result에 저장되었기 때문에 return result를 해준다.

3. 실행

  • 풀이 계획을 실행하고, 각 단계가 올바른지 점검하라.

첫번째 풀이

const solution = (array, commands) => {
    const firstArr = commands[0];
    const first = array.slice([firstArr[0] - 1], [firstArr[1]]).sort((a,b) => a-b);
    const f = first[firstArr[2] - 1];
    
    return [f];
};


test('commands배열 안에 한개의 배열만 있는 경우', () => {
    expect(solution([1, 5, 2, 6, 3, 7, 4], [[2, 5, 3]])).toBe([5]);
});

 

 

 

두번째 풀이

const solution = (array, commands) => {
    const result = commands.map((num) => {
        const arr = array.slice(num[0] - 1, num[1]).sort((a, b) => a - b);
        return arr[num[2] - 1];
    })

    return result;
};

test('commands배열 안에 한개의 배열만 있는 경우', () => {
    expect(solution([1, 5, 2, 6, 3, 7, 4], [[2, 5, 3]])).toBe([5]);
});

test('i번째 부터 j번째 까지 자른 수를 넣은 배열', () => {
    expect(solution([1, 5, 2, 6, 3, 7, 4], [[2, 5, 3], [4, 4, 1], [1, 7, 3]])).toBe([5, 6, 3]);
});

 

 

4. 반성

  • 문제를 다른 방식으로 해결할 수 있는가?
     - 첫번째 풀이를 하고 생각해보았는데 이때 map()를 사용할 수 있겠다고 생각했다.

 

🦄 Findings

문제를 단순하게 하기위해서 조건을 버리는 방법을 알게되었다. 

맨 처음에는 변수를 second, third까지 쓰고 하나씩 계산해보았는데 오히려 더 헷갈리기만 했다.

이때 조건을 버려서 commands의 길이가 1일때라고 가정하고 풀어볼 수 있었다.

 

sort()의 사용법에 대해서도 다시 알게되었다.

맨처음에 오름차순 정렬하라고 해서 그냥 sort()만 했는데 원하는 값이 안나오는 경우가 있었다.

그래서 sort((a,b) => a-b) 이렇게 해줘야만하는 이유를 알게되었다. 

 

sort()와 sort((a,b) => a-b)의 차이는 무엇일까?

sort 함수는 기본적으로 배열을 문자열로 간주하고 비교한다.

예를 들어 [b,a,c]라는 배열에 .sort()를 적용하면 [a,b,c]로 알맞게 정렬해준다.

그런데 숫자의 경우 [90,100,110]을 sort()로 정렬하면 자바스크립트는 값을 "90" "100" "110"으로 간주하고 비교한다.

이때 "90"과 "100"을 비교 시 앞자리 9와 1을 비교, 100보다 90이 더 크다는 결론을 내린다.

'코테연습' 카테고리의 다른 글

54. 모의고사 Javascript  (0) 2022.05.29
53. 문자열압축 Javascript  (0) 2022.05.27
51. 위장 Javascript  (0) 2022.05.25
50. 소수 만들기 javascript  (0) 2022.05.24
49. 완주하지 못한 선수  (0) 2022.05.24

댓글