본 문제는 정확성과 효율성 테스트 각각 점수가 있는 문제입니다.
스노우타운에서 호텔을 운영하고 있는 스카피는 호텔에 투숙하려는 고객들에게 방을 배정하려 합니다. 호텔에는 방이 총 k개 있으며, 각각의 방은 1번부터 k번까지 번호로 구분하고 있습니다. 처음에는 모든 방이 비어 있으며 스카피는 다음과 같은 규칙에 따라 고객에게 방을 배정하려고 합니다.
원하는 방 번호 | 배정된 방 번호 |
---|---|
1 | 1 |
3 | 3 |
4 | 4 |
1 | 2 |
3 | 5 |
1 | 6 |
전체 방 개수 k와 고객들이 원하는 방 번호가 순서대로 들어있는 배열 room_number가 매개변수로 주어질 때, 각 고객에게 배정되는 방 번호를 순서대로 배열에 담아 return 하도록 solution 함수를 완성해주세요.
k | room_number | result |
---|---|---|
10 | [1,3,4,1,3,1] | [1,3,4,2,5,6] |
room_number
를 차례대로 탐색하면서 방을 배정하고 answer
에 저장한다.allocated
에 <현재 방, 다음 방>
형태로 저장한다.roomNumber
를 배정한다.allocateRoom()
를 호출해서 방을 배정한다.HashSet만으로는 효율성에서 통과가 되지 않는 문제였다. 그래서 이분 탐색을 써야 하나 하고 고민을 해봤지만 풀리지 않았고, 결국 검색을 통해 HashMap을 사용해야 한다는 것을 알 수 있었다.
import java.util.*;
class Solution {
private static Map<Long, Long> allocated = new HashMap<>();
public long[] solution(long k, long[] room_number) {
ArrayList<Long> answer = new ArrayList<>();
for (long roomNumber : room_number) {
long result = allocateRoom(roomNumber);
allocated.put(result, result + 1);
answer.add(result);
}
return answer.stream().mapToLong(Long::longValue).toArray();
}
private long allocateRoom(long roomNumber) {
if (allocated.get(roomNumber) == null) return roomNumber;
allocated.put(roomNumber, allocateRoom(allocated.get(roomNumber)));
return allocated.get(roomNumber);
}
}