프로그래머스의 호텔 방 배정(Lv4) 문제이다.
[ 문제풀이 ]
접근 방법을 쉽게 생각하지 못해서 결국 다른 분들의 생각을 조금 참고해서 해결한 문제이다.
고객들이 원하는 방을 조건에 맞게 배정해 주어야 하는 문제이다.
이 문제를 구현할 때 핵심적으로 사용한 것은 2가지 이다.
1. STL map
2. Union - Find
먼저 방을 STL에서 제공해주는 map을 이용해서 관리해 주었다.
map은 간단하게 이야기해보면, 고유한 Key값과 그 Key값을 가지고 있는 Value값을 하나의 쌍으로 관리 하는 것이다.
여기서 '고유한 Key값'을 방 번호로 설정해 주었다.
예를 들어서 초기에 모든 방이 비어있는 상태에서, '1번방'을 원하는 손님이 나타났다고 생각해보자.
그럼 이 때, map에서 '1'이라는 값을 key값으로 가지는 원소가 존재하는지 판단하는 것이다.
현재는 모든 방이 비어있으므로, '1'이라는 값을 Key값으로 가지는 원소가 존재하지 않다는 것을 의미하고, map[1] = 0 이기 때문에, 그대로 방을 배정해 주면 된다.
그 이후에 또 한번 '1번방'을 원하는 손님이 나타났다고 생각해보자.
이 때는, map에서 '1'이라는 값을 key값으로 가지는 원소가 이미 존재하기 때문에 다른 방을 찾아야 할 것이다.
Union - Find를 이 과정에서 사용해 주었다. 사실 Union은 사용하지 않았고, 조건에 맞는 그 다음 방을 찾기 위해서 Find 하는 과정을 사용해 주었다.
예를 들어서, 'X번방'이 이미 꽉차서 다른 방을 찾아야 하는 경우라면, X + 1번방부터 탐색을 진행한다.
탐색의 종료조건은 위에서 선언해 놓은 map에서 '탐색하려는 방이 비어있으면' 종료해주었다.
말로 설명하니까 조금 어려워보이는데, 코드로 보면 굉장히 간단하다.
1 2 3 4 5 6 7 | map<long long, long long> Room; long long Find(long long N) { if (Room[N] == 0) return N; return Room[N] = Find(Room[N]); } | cs |
위의 과정이 빈방을 찾는 과정이다.
만약 "현재 탐색하려는 방이 비어있다면(line5)" 그 방의 번호를 return 해주고, 비어있지 않다면, 그 방에서 찾을 수 있는 비어있는 또 다른 방으로 탐색을 진행(line6) 해주었다.
이 과정을, 빈방일 때도, 빈방이 아닐때도 해주어야 한다.
왜냐하면 빈 방일 경우에는 그대로 손님을 방에 넣어준 후에, 그 다음번에 이 방을 원하는 손님이 나왔을 때를 생각해서 계산을 해놓는 것이다. 반대로, 빈 방이 아닐 때는 당연히 위의 과정을 통해서 빈 방을 찾아줘야 한다.
[ 소스코드 ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #include <string> #include <vector> #include <map> using namespace std; map<long long, long long> Room; long long Find(long long N) { if (Room[N] == 0) return N; return Room[N] = Find(Room[N]); } vector<long long> solution(long long k, vector<long long> room_number) { vector<long long> answer; for (int i = 0; i< room_number.size(); i++) { long long Num = room_number[i]; if (Room[Num] == 0) { answer.push_back(Num); Room[Num] = Find(Num + 1); } else { long long Next_Num = Find(Num); answer.push_back(Next_Num); Room[Next_Num] = Find(Next_Num + 1); } } return answer; } | cs |
'[ Programmers Code ] > # PG - Level4' 카테고리의 다른 글
[ 프로그래머스 블록 게임 (Lv4) ] (C++) (0) | 2020.06.02 |
---|---|
[ 프로그래머스 무지의 먹방 라이브 (Lv4) ] (C++) (0) | 2020.06.01 |
[ 프로그래머스 스티커 모으기(2) (Lv4) ] (C++) (0) | 2020.05.29 |
[ 프로그래머스 쿠키 구입 (Lv4) ] (C++) (0) | 2020.05.29 |
[ 프로그래머스 올바른 괄호의 갯수 (Lv4) ] (C++) (0) | 2020.05.28 |