배열 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 함수를 작성해주세요.
array의 길이는 1 이상 100 이하입니다.
array의 각 원소는 1 이상 100 이하입니다.
commands의 길이는 1 이상 50 이하입니다.
commands의 각 원소는 길이가 3입니다.
array commands return
[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입니다.
function solution(array, commands) {
var answer=[]
for (n=0;n<commands.length;n++){
var i=commands[n][0]
var j=commands[n][1]
var k=commands[n][2]
var slicearr=array.slice(i-1,j)
var sortarr=slicearr.sort((a,b) => a - b))
answer.push(sortarr[k-1])
}
return answer;
}
//이런식으로!!
var arr=[1, 5, 2, 6, 3, 7, 4]
var slicearr=arr.slice(1,5)
slicearr
(4) [5, 2, 6, 3]
slicearr.sort()
(4) [2, 3, 5, 6]
var sortarr=slicearr.sort()
sortarr[2]
5
function solution(array, commands) {
var i=commands[0]
var j=commands[1]
var k=commands[2]
var slicearr=array.slice(i-1,j) //아래 참고
var sortarr=slicearr.sort()
var answer=sortarr[k-1]
return answer;
}
solution([1, 5, 2, 6, 3, 7, 4],[2,5,3])
5
solution([1, 5, 2, 6, 3, 7, 4],[4,4,1])
6
solution([1, 5, 2, 6, 3, 7, 4],[1,7,3])
3
왜 array.slice ( i-1, j) 일까?
실제로 2번째부터 5번째 사이의 숫자들만 추출하려면
인덱스[1]부터 [4]까지의 값을 가져와야한다.
slice는 시작인덱스는 포함하지만 끝 인덱스는 제외한 채로 배열을 추출하기 때문에,
slice(1,5)를 실행하면 arr[1]부터 arr[4]를 가져올 수 있다.
이것을 i번째부터 j번째 사이의 숫자를 가져오는 것으로 표현할 때는 slice(i-1,j)가 된다.
입출력 예를 기준으로 봤을 때,
commands에 한꺼번에 여러개의 배열이 주어진다.
var array=[1, 5, 2, 6, 3, 7, 4]
var commands=[[2, 5, 3], [4, 4, 1], [1, 7, 3]]
function solution(array, commands) {
var answer=[]
for (n=0;n<commands.length;n++){
var i=commands[n][0]
var j=commands[n][1]
var k=commands[n][2]
var slicearr=array.slice(i-1,j)
var sortarr=slicearr.sort()
answer.push(sortarr[k-1])
/*test
console.log(n+'번째')
console.log('slicearr='+slicearr)
console.log('sortarr='+sortarr)
console.log('answer='+answer)
/*
/*실행결과
0번째
slicearr=2,3,5,6
sortarr=2,3,5,6
answer=5
1번째
slicearr=6
sortarr=6
answer=5,6
2번째
slicearr=1,2,3,4,5,6,7
sortarr=1,2,3,4,5,6,7
answer=5,6,3
answer
(3) [5, 6, 3]
*/
}
return answer;
}
js는 compareFunction이 제공되지 않으면 유니코드 포인터 순서로 문자열을 비교해서 정렬한다.
MDN에도 설명되어 있는 내용인데, 아래와 같은 방식으로 이루어진다.
array1 = [1, 30, 4, 21, 100000];
console.log(array1.sort());
// array1 = [1, 100000, 21, 30, 4];
따라서 문자열 비교가 아닌 숫자를 비교해야되므로 sort함수에 정렬순서를 정의해주면 된다.
var sortarr=slicearr.sort((a,b) => a - b))
원래 점수 나오는데... 실수로 꺼서 다시눌렀더니 점수가 안 나온다 ㅠㅠ
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/slice
arr.slice([begin[, end]])
시작인덱스와 끝 인덱스 사이 배열을 추출하여 반환한다.
**잘라서 추출하는 요소에는, 시작인덱스는 포함되지만 끝인덱스는 포함되지 않는다.
즉,
var arr=[a,b,c,d,e]
arr.slice(1,3)
//[b,c]
//arr[1]인 b는 포함되지만, arr[3]인 d는 포함되지 않는다.
splice() 메서드는 배열의 기존 요소를 삭제 또는 교체하거나 새 요소를 추가하여 배열의 내용을 변경한다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/splice
array.splice(start[, deleteCount[, item1[, item2[, ...]]]])
시작인덱스에서 ?개 요소를 제거하고 남은 요소를 반환한다.
정렬 순서 정의
js는 compareFunction이 제공되지 않으면 유니코드 포인터 순서로 문자열을 비교해서 정렬한다.
array1 = [1, 30, 4, 21, 100000];
console.log(array1.sort());
// array1 = [1, 100000, 21, 30, 4];
따라서 문자열 비교가 아닌 숫자를 비교해야되므로 sort함수에 정렬순서를 정의해주면 된다.
var sortarr=slicearr.sort((a,b) => a - b))