지영이의 개발 블로그

✔[프로그래머스]k번째 수 본문

코딩/코딩테스트

✔[프로그래머스]k번째 수

이지영 2022. 7. 2. 15:22

문제 설명

배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.

예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면

  1. array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
  2. 1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
  3. 2에서 나온 배열의 3번째 숫자는 5입니다.

배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한사항
  • array의 길이는 1 이상 100 이하입니다.
  • array의 각 원소는 1 이상 100 이하입니다.
  • commands의 길이는 1 이상 50 이하입니다.
  • commands의 각 원소는 길이가 3입니다.
입출력 예arraycommandsreturn
[1, 5, 2, 6, 3, 7, 4] [[2, 5, 3], [4, 4, 1], [1, 7, 3]] [5, 6, 3]
입출력 예 설명

[1, 5, 2, 6, 3, 7, 4]를 2번째부터 5번째까지 자른 후 정렬합니다. [2, 3, 5, 6]의 세 번째 숫자는 5입니다.
[1, 5, 2, 6, 3, 7, 4]를 4번째부터 4번째까지 자른 후 정렬합니다. [6]의 첫 번째 숫자는 6입니다.
[1, 5, 2, 6, 3, 7, 4]를 1번째부터 7번째까지 자릅니다. [1, 2, 3, 4, 5, 6, 7]의 세 번째 숫자는 3입니다

 


<사용하는함수>

slice() 함수

slice() 함수는 배열로 부터 특정 범위를 복사한 값들을 담고 있는 새로운 배열을 만드는데 사용합니다. 첫번째 인자로 시작 인덱스(index), 두번째 인자로 종료 인덱스를 받으며, 시작 인덱스부터 종료 인덱스까지 값을 복사하여 반환합니다.

간단한 실습을 위해 숫자 0부터 19까지를 담고있는 배열을 생성하여 nums라는 변수에 할당해보겠습니다. (브라우저의 콘솔에서 따라서 코딩해보시기를 추천드립니다.)

> nums = Array(20).fill().map((_, i) => i)
< [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

이 숫자 배열에서 5부터 9까지를 복사한 값을 담고 있는 새로운 배열을 만들어 보겠습니다.

> nums.slice(5, 10)
< [5, 6, 7, 8, 9]

여기서 주의할 점은 첫번째 인자로 넘어온 시작 인덱스가 가리키는 값은 포함하지만, 두번째 인자로 넘어온 종료 인덱스가 가리키는 값은 포함하지 않는다는 것입니다.

두번째 인자를 넘기지 않으면, 시작 인덱스가 가리키는 값부터 배열의 마지막 값까지 모두 복사해줍니다.

> nums.slice(10)
< [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

 


<내가풀이한 코드>

1)

for 문 사용하여 풀어줌

2)

map 함수를 사용하여 코드 길이를 줄여줌

(해석)

start에서 end까지 자른다는 구문을 봤을 때 바로 Array.slice()를 이용해야 한다고 생각했다.

2번째 숫자부터 라는 말은 1번 인덱스부터 시작한다는 말이고

5번째 숫자까지는 4번 인덱스(= 5번 인덱스 미만)까지 자른다는 걸 유의해야 한다.

그 다음, Array.sort()를 이용하여 오름차순으로 정렬하고 

slice()함수로 잘라주면 결과값이 [[5],[6],[3]]  이렇게 이차원 배열 형태로 나오게 되는데 [0]을 사용해  2차원 배열의 0번째 인덱스를 결과로 주면 됨 

 

 

<다른사람이푼코드>

.slice(v[2] -1 , v[2])[0]울 [a[2]-1]로 변경해서 코드를 좀더 간결하게 표현할 수 있다

Comments