Problem Solving/Programmers
[Programmers]2019 카카오 개발자 겨울 인턴십: 호텔 방 배정(C++)/Disjoint Set
이진2
2021. 6. 15. 01:40
https://programmers.co.kr/learn/courses/30/lessons/64063
코딩테스트 연습 - 호텔 방 배정
programmers.co.kr
레벨 4라서 두려움에 떨었던 문제
백준식 풀이법(안풀리면 컨닝)으로 disjoint set이라는 건 알았지만 어떻게 풀지 고민했다
그래서 처음에는 0이라는 더미 노드를 만들어서 방이 나올 때 마다 union하고, find해서 parent가 0과 다를 때 새로운 node를 더해주는 식으로 구현했다
하지만 그렇게 구현하니까 브루트포스와 다를게 없었다 ...
그래서 효율성에서 광탈하고 카카오 테크 블로그 풀이를 슬쩍했다
이것이 핵심 로직인데 union-find 자료구조의 find 부분을 응용한 부분이 핵심인 것 같당
이렇게 빈 방이 있을 경우에는 새로 노드를 만들어서 다음 방을 가리키게 하고
빈 방이 없을 때 에는 재귀적으로 부모 노드를 계속 방문하면서 path를 갱신해준다
또한 메모리 초과가 계속 발생했는데 k의 최대값이 10^12이므로 linear array에 저장이 불가능했다
[최대 방 개수]=10^12
[고객이 원하는 방 개수]=200,000
이므로 고객이 원하는 방 개수만큼의 메모리만 필요하다
그래서 hashmap(c++에서는 map)을 사용해서 parent를 저장해주면 끝 ~~
코드는 엄청 짧당
#include <vector>
#include <map>
using namespace std;
map<long long, long long> m;
long long func(long long x) {
if (m.find(x) == m.end()) {
m.insert(make_pair(x, x + 1));
return x;
}
return m.find(x)->second = func(m.find(x)->second);
}
vector<long long> solution(long long k, vector<long long> room_number) {
vector<long long> answer;
for (auto x : room_number) {
answer.push_back(func(x));
}
return answer;
}