호텔 방 배정
Last update: a year ago by nowwaterReading time: 2 min
문제
코드
코드 보기
import java.util.*;public class intern20194 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);long k = sc.nextLong(), room_number[] = new long[200000];int m = sc.nextInt();for (int i = 0; i < m; i++)room_number[i] = sc.nextLong();Solution solution = new Solution();long[] answer = solution.solution(k, room_number);for (long l : answer) {System.out.println(l);}}}class Solution {static long k, room_number[];static Map<Long, Long> parent = new HashMap<>();public long[] solution(long kk, long[] room_numberr) {k = kk;room_number = room_numberr;long[] answer = {};List<Long> ansList = new ArrayList<>();for (int i = 0; i < room_number.length; i++) {long pos = makeUnion(room_number[i]);ansList.add(pos);}int idx = 0;answer = new long[ansList.size()];for (long aLong : ansList)answer[idx++] = aLong - 1;return answer;}long makeUnion(long num){if(!parent.containsKey(num)) {parent.put(num, num + 1);return num + 1;}long p = makeUnion(parent.get(num));parent.put(num, p);return p;}}/*10 61 3 4 1 3 1*/
⭐️느낀점⭐️
문제 조건에서
신청한 순서대로 방을 배정. 이미 배정되어 있으면 원하는 방보다 번호가 크면서 비어있는 방 중 가장 작은 번호의 방 배정
이라는 걸 보고 계속lower_bound
를 생각해서 거기에 갇혀버렸다.ㅜㅜ
Union-find
가 전형적인 그래프 문제 외에도 이렇게 쓰인다는 것을 처음 배웠다.
풀이 📣
1️⃣ 메모리 절약을 위해 해쉬맵을 사용하여 고객의 정보를 저장한다.
- 원하는 방 번호를 키로 가지는 노드를 찾아보고 비어있다면 그 노드에 정보를 저장하고 부모를 반환한다.- 만약 이미 존재한다면 그 노드의 부모 노드를 구해서 value 를 갱신해주고 부모 노드를 반환한다.
2️⃣ 각 고객의 정보가 저장되어 있는 노드의 키 값은 부모 노드의 번호인 key + 1
를 가지고 있다.
3️⃣ 리스트를 만들어서 고객의 순번대로 고객의 정보가 저장되어 있는 트리맵의 키값을 저장해준다.
4️⃣ 순서대로 출력해주고 종료한다.
실수 😅
계속 이분탐색으로 풀어야한다고 생각해서 다른 알고리즘을 떠올리지 못했다.
이분탐색에 꽂히지 않았어도 유니온-파인드 알고리즘을 적용시키진 못했을 것 같다.. 하지만 굉장히 도움이 많이 되는 문제였다!