
본 문제는 정확성과 효율성 테스트 각각 점수가 있는 문제입니다.
스노우타운에서 호텔을 운영하고 있는 스카피는 호텔에 투숙하려는 고객들에게 방을 배정하려 합니다. 호텔에는 방이 총 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);
}
}