k번째 수

GY·2021년 7월 13일
0

알고리즘 문제 풀이

목록 보기
10/92
post-thumbnail

문제 설명

배열 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입니다.

CODE


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;
}

과정

계획

  1. slice로 자른다 (i,j)
  2. sort로 정렬한다 (오름차순)
  3. [k] 요소를 리턴한다.

//이런식으로!!
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;
}

2번 테스트 실패 (sort 정렬 순서 정의)

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))


원래 점수 나오는데... 실수로 꺼서 다시눌렀더니 점수가 안 나온다 ㅠㅠ



REVIEW

slice()

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()

splice() 메서드는 배열의 기존 요소를 삭제 또는 교체하거나 새 요소를 추가하여 배열의 내용을 변경한다.

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/splice

array.splice(start[, deleteCount[, item1[, item2[, ...]]]])

시작인덱스에서 ?개 요소를 제거하고 남은 요소를 반환한다.

sort()

정렬 순서 정의
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))
profile
Why?에서 시작해 How를 찾는 과정을 좋아합니다. 그 고민과 성장의 과정을 꾸준히 기록하고자 합니다.

0개의 댓글