1. 문제
배열 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 함수를 작성해주세요.
2. 나의 코드
function solution(array, commands) {
let answer = [];
// commands의 길이만큼 반복한다.
for(let i = 0; i < commands.length; i++) {
// 예제에서 확인했을 때, i와 k는 각각 값에서 1을 빼주어야 한다.
let arr = array.slice(commands[i][0]-1, commands[i][1]);
// i,k를 적용한 배열을 오름차순으로 적용
arr.sort(function(a,b) {
return a - b;
})
// k번째 값을 가져와서 답 배열에 추가
answer.push(arr[commands[i][2]-1])
}
// i와 j는 인덱스 값이 아닌, 해당위치의 값 조정이 필요
return answer;
}
특정 위치에 있는 값을 가져오기 위해서 slice메서드가 먼저 떠올랐다. slice(a, b)메서드의 경우에는 a번째 인덱스에 있는 값을 포함하고, b번째 인덱스에 있는 값부터 이후 인덱스의 값을 제외한 배열을 반환한다.
let arr = ['a', 'b', 'c', 'd', 'e', 'f'];
arr.slice(1,3); // ['b', 'c']
arr.slice(2); // ['c', 'd', 'e', 'f']
arr.slice(1, -2) // ['b', 'c', 'd']
위의 코드를 보면 이해가 쉬울 것 같다 : ). 재미있는 점은 음수 값도 입력할 수 있다. 음수는 뒤에서 부터 -1. -2.... 로 순차적으로 작아진다. 문제조건에 맞게 배열을 만들고 sort()를 통해서 오름차순을 만들어 준다. sort() 함수도 단순히 arr.sort()로 사용하면 참사가 일어난다.
let arr2 = [1, 11, 2, 4, 7, 24];
arr2.sort(); // [1, 11, 2, 24, 4, 7]
arr2.sort(function(a, b) {
return a - b;
}) // [1, 2, 4, 7, 11, 24]
sort()를 사용하면 순차적으로 오름차순으로 나타날 것 같지만 전혀 그렇지 않다. 예상과는 다르게 11이 2보다 앞서서 정렬되는 것을 볼 수 있다. 그 이유는 sort함수에 매개변수를 넣지 않는 경우에는 ASCII 문자 기준으로 오름차순 정렬을 한다. 일시적으로 아스키 문자를 기준으로 정렬할 때, 숫자를 문자열로 변환을 한다. 그리고 변환하고 나서 첫 번째 문자(숫자)로 비교하기 때문에, 11의 1이 2보다 작은 아스키 값을 가진다.
필요한 숫자들을 다 가지고 와서, 답을 적는 배열에 추가를 해주고 반환을 해준다. 공부... 공부... 끄적...
- sort함수에 대한 참조 : https://brunch.co.kr/@swimjiy/12
'리코딩 : 알고리즘' 카테고리의 다른 글
6. 프로그래머스 - 나누어 떨어지는 숫자 배열 (0) | 2021.09.16 |
---|---|
5. 프로그래머스 - 3진법뒤집기 (0) | 2021.09.15 |
4. 프로그래머스 - 실패율 (0) | 2021.09.14 |
3. 프로그래머스 - 기능개발 (0) | 2021.09.13 |
1. 프로그래머스 - 행렬의 덧셈 (0) | 2021.08.26 |