[본 문제는 정확성과 효율성 테스트 각각 점수가 있는 문제입니다.]
"스노우타운"에서 호텔을 운영하고 있는 "스카피"는 호텔에 투숙하려는 고객들에게 방을 배정하려 합니다. 호텔에는 방이 총 k개 있으며, 각각의 방은 1번부터 k번까지 번호로 구분하고 있습니다. 처음에는 모든 방이 비어 있으며 "스카피"는 다음과 같은 규칙에 따라 고객에게 방을 배정하려고 합니다.
예를 들어, 방이 총 10개이고, 고객들이 원하는 방 번호가 순서대로 [1, 3, 4, 1, 3, 1] 일 경우 다음과 같이 방을 배정받게 됩니다.
전체 방 개수 k와 고객들이 원하는 방 번호가 순서대로 들어있는 배열 room_number가 매개변수로 주어질 때, 각 고객에게 배정되는 방 번호를 순서대로 배열에 담아 return 하도록 solution 함수를 완성해주세요.
분리 집합
문제 분리 집합 기본 코드map
을 쓰면 된다.answer
배열에 현재 방 번호를 저장한다.(단순히 번호가 1큰 방이 아니라 번호가 1 큰 방의 부모)
을 합집합한다.answer
배열에 부모의 방 번호를 저장한다. for (long long room : room_number) {
if (!m[room]) {
answer.push_back(room);
unionParent(m, room, room + 1);
}
else {
room = findParent(m, room);
answer.push_back(room);
unionParent(m, room, room + 1);
}
}
if
문을 단순화 시켜준다. for (long long room : room_number) {
if (m[room]) {
room = findParent(m, room);
}
answer.push_back(room);
unionParent(m, room, room + 1);
}
long long
으로 잘 써놓고 findParent
의 x만 int
로 썼다.unionParent
의 코드를 기존 코드를 쓰다보니 쓸데없는 코드가 있어서 삭제했다.변경 전
void unionParent(map<long long, long long> &m, long long a, long long b) {
a = findParent(m, a);
b = findParent(m, b);
if (a < b) m[a] = b;
else m[b] = a;
}
변경 후
void unionParent(map<long long, long long> &m, long long a, long long b) {
a = findParent(m, a);
b = findParent(m, b);
m[a] = b;
}
#include <string>
#include <vector>
#include <map>
using namespace std;
long long findParent(map<long long, long long> &m, long long x) {
if (!m[x]) return x;
else return m[x] = findParent(m, m[x]);
}
void unionParent(map<long long, long long> &m, long long a, long long b) {
a = findParent(m, a);
b = findParent(m, b);
m[a] = b;
}
vector<long long> solution(long long k, vector<long long> room_number) {
vector<long long> answer;
map<long long, long long> m;
for (long long room : room_number) {
if (m[room]) {
room = findParent(m, room);
}
answer.push_back(room);
unionParent(m, room, room + 1);
}
return answer;
}