본문 바로가기

Algorithm/PS

[1일 1알고] 호텔 방 배정

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

 

프로그래머스

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

programmers.co.kr

 

방을 배정할 때 원하는 방이 이미 배정되어있다면 크면서도 가장 가까운 값을 가지는 방을 배정해줘야합니다.

 

일단 저는 처음에 연결리스트를 사용해서 빠르게 접근하는 방법을 생각했습니다. 

예를 들어 2를 방문했다면 1->3, 2->3과 같이 이어주려고 했습니다.

 

그런데 기본적으로 연결리스틀 만들기 위해서는 노드를 미리 만들 필요가 있지만 문제의 k는 최대 10^12이기 때문에 노드를 미리 만들 수 없습니다.

 

따라서 다른 방법을 생각해야했는데 이를 위해 union-find와 비슷하게 만들었습니다.

#include <string>
#include <vector>
#include <unordered_map>
using namespace std;

unordered_map<long long, long long> room_map;
long long Find(long long number)
{
    if (room_map.find(number) == room_map.end())
    {
        return number;
    }

    room_map[number] = Find(room_map[number]);
    return room_map[number];
}

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 number = room_number[i];

        long long assignedRoom = Find(number);

        answer.push_back(assignedRoom);

        room_map[assignedRoom] = Find(assignedRoom + 1);
    }

    return answer;
}

순서가 상관 없기 때문에 속도를 위해 unordered_map을 사용했습니다.

 

현재 사람이 원하는 방을 배정받고, 같은 방을 원하면 돌려줄 방을 다시 찾아 할당합니다.

'Algorithm > PS' 카테고리의 다른 글

[1일 1알고] 달리기 경주  (0) 2026.06.17
[1일 1알고] 물 부족  (0) 2026.06.16
[1일 1알고] 기지국 설치  (0) 2026.06.11
[1일 1알고] 리틀 프렌즈 사천성  (0) 2026.06.10
[1일 1알고] 광고 삽입  (0) 2026.06.09