LeetCode - Queue Reconstruction by Height (Javascript)
문제 설명
You are given an array of people, people
, which are the attributes of some people in a queue (not necessarily in order). Each people[i] = [hi, ki]
represents the ith
person of height hi
with exactly ki
other people in front who have a height greater than or equal to hi
.
Reconstruct and return the queue that is represented by the input array people
. The returned queue should be formatted as an array queue
, where queue[j] = [hj, kj]
is the attributes of the jth
person in the queue (queue[0]
is the person at the front of the queue).
Example 1:
1 | Input: people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]] |
Example 2:
1 | Input: people = [[6,0],[5,0],[4,0],[3,2],[2,2],[1,4]] |
Constraints:
1 <= people.length <= 2000
0 <= hi <= 106
0 <= ki < people.length
- It is guaranteed that the queue can be reconstructed.
소스 코드
splice
를 활용해서 문제를 풀었다.
우선, 키가 큰 사람들의 위치를 먼저 배치해야 작은 사람들의 위치가 적절히 결정될 수 있기에, 키순 오름차순 정렬을 제일 먼저 수행했다.
1 | const reconstructQueue = (people) => { |
풀이 과정
splice
의 특성을 잘 파악하면 굉장히 쉽게 해결할 수 있는 문제다.
먼저, 아래와 같이 키 내림차순으로 정렬해준다. (만약 키가 같을 경우에는 k 기준 오름차순으로 정렬)
그리고 반복문을 통해 각 요소들을 result 배열의 k
번째 자리에 추가해준다. 이를 splice
를 통해 구현해야 한다. 먼저, 빈 answer 배열에 answer.splice(person[1], 0, person)
을 통해 아래와 같이 0번째 index에 person을 추가해준다.
그리고 또 다시 [5,0]을 answer의 0번째 index에 추가해줘야 하기 때문에 기존의 [6,0]은 index 1로 밀린다. 따라서 answer의 배열 형태는 아래와 같이 될 것이다.
그리고 반복문을 이어가다 보면, 아래 그림처럼 0번째 인덱스에 대한 정리는 마무리 된다.
그리고 이 아래의 경우부터
splice
를 사용한 목적이 드러난다.
[3,2]
라는 사람은 자신보다 키가 큰 사람이 앞에 두 명 있어야 한다. 따라서 index 2에 배치해주면 자연스럽게 자신의 앞에는 자신보다 큰 키를 가진 사람이 두 명 존재하게 되며 조건을 만족한다.
그리고 그 다음의 경우에도 [2,2]는 [3,2]를 밀어내고 2번 인덱스를 차지한다.
이런식으로 키가 큰 사람들을 우선적으로 알맞은 인덱스에 배치한 후에, 작은 사람들이 정확한 위치에 배치될 수 있도록
splice
를 사용한 것이다.
LeetCode - Queue Reconstruction by Height (Javascript)
https://hoonjoo-park.github.io/algorithm/leet/queReconstruction/