Lv 4. 호텔 방 배정

2025. 3. 21. 01:04·Algorithm & Data Structures/Programers

 

https://school.programmers.co.kr/learn/courses/30/lessons/64063

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

 

📌 자바(Java)로 푸는 호텔 방 배정 문제 - 프로그래머스 🏨

🔎 문제 개요

프로그래머스 - 호텔 방 배정 문제입니다.
호텔에는 k개의 방이 있으며, 손님이 원하는 방을 요청하면 비어 있으면 배정하고,
비어있지 않다면 가장 가까운 빈 방을 배정해야 합니다.
🚪 여러 손님이 들어오면서 빠르게 배정하는 것이 핵심입니다.



💡 예제 입력

long k = 10;
long[] room_number = {1, 3, 4, 1, 3, 1};

💡 예제 출력

[1, 3, 4, 2, 5, 6]

➡ 요청된 방이 이미 배정되었으면, 가장 가까운 빈 방을 찾아 배정



🛠 알고리즘 접근 방식

이 문제를 해결하기 위해 유니온-파인드(Union-Find) + 경로 압축(Path Compression) 을 활용합니다.

✏️ 주요 고려 사항

✔ 손님이 원하는 방이 비어있다면 즉시 배정
✔ 이미 배정된 방이면, 가장 가까운 빈 방을 찾아 배정
✔ 경로 압축(Path Compression) 기법을 사용하여 빠르게 빈 방을 찾음
✔ 각 방 번호를 HashMap<Long, Long>을 활용하여 관리



🔹 Java 코드 해설

import java.util.*;

class Solution {

    HashMap<Long,Long> status = new HashMap<>();

    public long[] solution(long k, long[] room_number) {
        int len = room_number.length;
        long[] answer = new long[len];

        for (int i = 0; i < len; i++) {
            answer[i] = find(room_number[i]);
        }
        return answer;
    }
    
    long find(long room_num) {
        if (!status.containsKey(room_num)) {
            status.put(room_num, room_num + 1);
            return room_num;
        }
        long empty = find(status.get(room_num));  // 경로 압축
        status.put(room_num, empty + 1); // 부모를 업데이트
        return empty;
    }
}

 



🔍 코드 설명

📌 1. 손님이 요청한 방을 확인

if (!status.containsKey(room_num)) {
    status.put(room_num, room_num + 1);
    return room_num;
}

✔ 비어있다면 해당 방을 배정하고, 다음 빈 방을 갱신
✔ 처음 방문하는 방은 그대로 배정



📌 2. 경로 압축을 활용한 빈 방 찾기

long empty = find(status.get(room_num));  // 경로 압축
status.put(room_num, empty + 1); // 부모를 업데이트
return empty;

✔ 이미 배정된 방이면 가장 가까운 빈 방을 찾음
✔ 경로 압축(Path Compression) 기법을 활용하여 빠르게 업데이트



🏆 정리

✅ 핵심 포인트

✔ 유니온-파인드(Union-Find) 알고리즘을 사용하여 최적화
✔ 경로 압축(Path Compression)으로 빠르게 빈 방 찾기
✔ HashMap을 활용하여 O(1)에 가깝게 처리

🎯 이 알고리즘의 장점

✅ 빠르게 가장 가까운 빈 방을 찾을 수 있음
✅ O(N log N) 복잡도로 최적화된 풀이 가능
✅ 대량의 요청이 들어와도 빠르게 처리 가능



이 글이 도움이 되셨다면 좋아요와 공유 부탁드립니다! 😊

 

 

'Algorithm & Data Structures > Programers' 카테고리의 다른 글

Lv 2. 택배 배달과 수거하기  (0) 2025.04.04
Lv 3. 광고 삽입  (0) 2025.04.03
Lv 3. 미로 탈출 명령어  (0) 2025.03.17
Lv 2. 지게차와 크레인  (0) 2025.03.13
Lv 2. 서버 증설 횟수  (1) 2025.03.11
'Algorithm & Data Structures/Programers' 카테고리의 다른 글
  • Lv 2. 택배 배달과 수거하기
  • Lv 3. 광고 삽입
  • Lv 3. 미로 탈출 명령어
  • Lv 2. 지게차와 크레인
Geisha
Geisha
개발 일기
  • Geisha
    Geisha
    Geisha
  • 전체
    오늘
    어제
    • 분류 전체보기 (326)
      • Algorithm & Data Structures (246)
        • BOJ (104)
        • SWEA (1)
        • Programers (137)
        • Data Structures (3)
      • DB (27)
        • SQL (21)
        • RDBMS (2)
      • Java (1)
        • Class (1)
      • Spring (5)
        • Spring MVC (1)
        • Annotations (1)
      • CS (36)
        • 운영체제 (13)
        • 네트워크 (5)
      • Tool (6)
        • Git (5)
        • AWS (1)
      • Project (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    dp
    구현
    다익스트라
    이분탐색
    binarySearch
    unionfind
    골드
    프로그래머스
    스택
    Stack
    Java
    programmers
    동적계획법
    algorithm
    유니온파인드
    DynamicProgramming
    투포인터
    SQL
    알고리즘
    baekjoon
    dfs
    Dijkstra
    Union-Find
    경로압축
    후위순회
    BFS
    PriorityQueue
    백트래킹
    백준
    전위순회
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
Geisha
Lv 4. 호텔 방 배정
상단으로

티스토리툴바