Close
Close full mode
logo만렙 개발자 키우기

호텔 방 배정

Git RepositoryEdit on Github
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 6
1 3 4 1 3 1
*/

⭐️느낀점⭐️

문제 조건에서 신청한 순서대로 방을 배정. 이미 배정되어 있으면 원하는 방보다 번호가 크면서 비어있는 방 중 가장 작은 번호의 방 배정 이라는 걸 보고 계속 lower_bound 를 생각해서 거기에 갇혀버렸다.ㅜㅜ

Union-find 가 전형적인 그래프 문제 외에도 이렇게 쓰인다는 것을 처음 배웠다.

풀이 📣


1️⃣ 메모리 절약을 위해 해쉬맵을 사용하여 고객의 정보를 저장한다.

- 원하는 방 번호를 키로 가지는 노드를 찾아보고 비어있다면 그 노드에 정보를 저장하고 부모를 반환한다.
- 만약 이미 존재한다면 그 노드의 부모 노드를 구해서 value 를 갱신해주고 부모 노드를 반환한다.

2️⃣ 각 고객의 정보가 저장되어 있는 노드의 키 값은 부모 노드의 번호인 key + 1 를 가지고 있다.

3️⃣ 리스트를 만들어서 고객의 순번대로 고객의 정보가 저장되어 있는 트리맵의 키값을 저장해준다.

4️⃣ 순서대로 출력해주고 종료한다.


실수 😅

  • 계속 이분탐색으로 풀어야한다고 생각해서 다른 알고리즘을 떠올리지 못했다.

  • 이분탐색에 꽂히지 않았어도 유니온-파인드 알고리즘을 적용시키진 못했을 것 같다.. 하지만 굉장히 도움이 많이 되는 문제였다!

👩‍💻 Problem Solving — Previous
불량 사용자
Next — 👩‍💻 Problem Solving
징검다리 건너기