차차로그
[JS] 정렬 > K번째수 본문
배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.
예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면
- array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
- 1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
- 2에서 나온 배열의 3번째 숫자는 5입니다.
배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.
문제만 봤을 땐 쉬워보였는데 생각보다 푸는데 어려웠던 문제..
commands가 2차원 배열로 되어 있어서 값을 가져오는게 자꾸 헷갈렸다
array : [1, 5, 2, 6, 3, 7, 4]
commands : [[2, 5, 3], [4, 4, 1], [1, 7, 3]]
return : [5, 6, 3]
function solution(array, commands) {
var answer = [];
var re = [];
commands.forEach((v,i) => {
answer.push(array.slice(v[0]-1, v[1]));
})
answer.forEach((v,i) => {
answer[i].sort((a,b) => a-b);
re.push(answer[i][commands[i][2]-1]);
})
return re;
}
내가 작성한 코드
먼저 commands를 반복해서 array의 배열을 정해진 길이만큼 잘라줬다.
commands[0][1]이 2고 commands[0][1]이 5니까 array의 2번부터 5번까지 잘라서 answer 배열에 담고..그것을 commands 길이만큼 반복
주의해야할게 2와 5가 인덱스가 아닌 2번째위치, 5번째위치까지다.. 인덱스로 따지면 [1]과 [4].
slice는 첫 번째 인덱스부터 두 번째 인덱스 전까지 잘라주는 메소드기 때문에 첫 번째 인덱스엔 1을 빼서 array의 1번부터 4번까지 잘라줬다.
answer에 잘라 담게 되면 answer도 2차원 배열이 된다
다음 오름차순으로 정렬을 해주고 정렬한 배열에서 commands[i][2]의 위치를 찾아 다시 배열에 담아야 한다.
answer 배열을 반복문으로 돌리면서 answer의 i 인덱스에 있는 배열에서 commands의 [i][2]-1 위치의 값을 찾아 새로운 배열 re에 담았다.
여기서 commands가 가리키는 위치도 인덱스가 아닌 몇 번째 자리이기 때문에 1을 빼줬다
answer 배열과 commands 배열 길이가 동일하기 때문에 같이 i로 인덱스를 정했댜
function solution(array, commands) {
return commands.map(command => {
const [sPosition, ePosition, position] = command
const newArray = array
.filter((value, fIndex) => fIndex >= sPosition - 1 && fIndex <= ePosition - 1)
.sort((a,b) => a - b)
return newArray[position - 1]
})
}
다른 사람 풀이
commands배열을 map으로 반복했다.
value를 command로 받고 const [sPosition, ePosition, position] = command로 commands의 같은 인덱스에 있는 값끼리 묶었다.
array는 filter로 반복을 돌리면서 array인덱스가 시작 숫자(sPosition)-1 ~ 종료숫자(ePosition)-1 까지인 경우만 배열에 담고 (=> 인덱스를 찾아 그 범위만큼만 배열에 저장) sort로 정렬을 해줬다.
그 후에 정렬된 newArray 배열에서 position - 1의 위치를 찾아 반환해줬다
사용한 메소드를 보면 무슨 말인지 알겠는데 정확히 어떻게 작동?되는지는 확실히 모르겠다..

'코딩테스트' 카테고리의 다른 글
[JS] 연습문제 > 문자열 내 p와 y의 개수 (0) | 2022.08.18 |
---|---|
[JS] 연습문제 > 2016년 (0) | 2022.08.18 |
[JS] Summer/Winter Coding(~2018) > 소수 만들기 (0) | 2022.08.16 |
[JS] 월간 코드 챌린지 시즌2 > 약수의 개수와 덧셈 (0) | 2022.08.12 |
[JS] 월간 코드 챌린지 시즌1 > 3진법 뒤집기 (0) | 2022.08.12 |