https://programmers.co.kr/learn/courses/30/lessons/64063
- 방의 갯수가 최대 1e12 1조이고, 고객들이 요청하는 방 갯수는 20만이다. 고객들이 요구한 번호의 방 혹은 번호가 크면서 비어있는 방 중 가장 번호가 작은 방이라는 조건이 있기 때문에 해시맵으로 사용된 방과 사용할 수 있는 그 다음 방을 해쉬맵에 기록하는 방식으로 접근하였다.
- 방을 길이 k의 1차원배열로 생각했을 때 방 정보를 업데이트 할 때마다 해당 방의 오른쪽으로 연결되어있는 방들에 대하여 다음 제공할 수 있는 방 정보에 대해 경로압축을 해놓으면 사용가능한 다음 방을 logM 혹은 a(M)안에 찾을 수 있다.(M은 시작지점으로부터 오른쪽으로 이미 배정되어있는 방들이 이어진 길이에 대해서 경로압축 했을 경우 아커만 함수에 따라 최대 5), 따라서 Nlog(M) = 손님 20만 * 방탐색 log(20만) 복잡도로 풀 수 있다.
- 그동안 배열이나 그래프, 트리에서 disjoint Set을 구현하기 위해 유니온 파인드를 자주 사용하곤 했는데, 이미 사용된 방에 대하여 다음 사용가능한 다음 방을 표현하기 위해 해시맵으로 구현해야되는 문제이다.
import java.util.*;
class Solution {
Map<Long, Long> map = new HashMap<>(); // {now:next}
public long[] solution(long k, long[] room_number) {
int N = room_number.length;
long[] ans = new long[N];
for(int i = 0; i < N; ++i) {
ans[i] = find(room_number[i]);
}
return ans;
}
long find(long x) {
if(map.get(x) == null) {
map.put(x, x + 1);
return x;
}
long y = find(map.get(x));
map.put(x, y);
return y;
}
}
'Algorithm > programmers' 카테고리의 다른 글
2019 Kakao blind - 수식 최대화(정규표현식, 해싱) java 풀이 (0) | 2022.04.16 |
---|---|
2019 카카오 개발자 겨울 인턴쉽 - 징검다리 건너기(이분 탐색, 슬라이딩 윈도우) - Java 풀이 (0) | 2022.03.28 |
2019 카카오 개발자 겨울 인턴쉽 - 불량 사용자(순열, 해시, 정규표현식) - Java 풀이 (0) | 2022.03.28 |
2019 카카오 개발자 겨울 인턴쉽 - 튜플(문자열 파싱, 구현 ) - Java 풀이 (0) | 2022.03.28 |
2022 Kakao blind 92343 - 양과 늑대(트리, 백트래킹 or dp) - Java, C++ 풀이 (0) | 2022.03.24 |