HelloMinchan
처음처럼
HelloMinchan
LinkedIn
전체 방문자
오늘
어제
  • 분류 전체보기 (306)
    • Backend (4)
      • NestJS (1)
      • Express (1)
      • Spring (2)
    • Infrastructure (1)
      • AWS (1)
    • Frontend (1)
      • Next.js (1)
    • Language & Runtime (4)
      • Java (2)
      • Node.js (2)
    • Computer Science (8)
      • Computer Networks (3)
      • Operating Systems (4)
      • OOP (1)
    • 독서 (4)
      • 데이터 중심 애플리케이션 설계 (3)
      • 객체지향의 사실과 오해 (1)
    • 회고 (4)
      • Project (2)
      • Career (2)
    • Deprecated (280)

채널

  • GitHub
  • LinkedIn

최근 글

태그

  • Database
  • 알고스팟
  • Baekjoon Online Judge
  • 코딩
  • 개발자
  • 백준Python
  • programmers
  • 프로그래밍
  • back-end
  • 백준
  • 데이터베이스
  • 백엔드
  • 백준Go
  • front-end
  • 프로그래머스C++
  • Algospot
  • 프로그래머스
  • 프로그래머스Python
  • 알고스팟Python
  • 백준C++

최근 댓글

인기 글

hELLO
HelloMinchan

처음처럼

[programmers] 프로그래머스 호텔 방 배정(Python)
Deprecated

[programmers] 프로그래머스 호텔 방 배정(Python)

2020. 5. 18. 19:58

(주)그렙

[programmers] 프로그래머스 호텔 방 배정

(Python)

(글쓴날 : 2020.05.18)

 


* programmers, 프로그래머스 문제 Python 언어 풀이입니다.

* 소스 코드의 저작권은 글쓴이에게 있습니다.


 

 

프로그래머스 호텔 방 배정


1) 문제

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/64063

 

코딩테스트 연습 - 호텔 방 배정

 

programmers.co.kr


2) 풀이 과정

* 시간 복잡도 : O(α(n), α : 아커만 함수)

 

방이 총 k개인 호텔에 고객들을 배정할 때, 만약 고객이 원하는 방이 비어있을 시 그 방을 배정하고, 비어있지 않다면 고객이 원하는 방보다 번호가 크면서 가장 작은 번호의 남은 방을 배정하여, 각 고객에게 배정되는 방 번호를 순서대로 배열에 저장하는 문제입니다.

 

저의 경우, 유니온 파인드를 적용하였고, Python을 사용했습니다.

먼저 배정된 방을 기록할 dictionary를 선언하였고, 그 후 고객들이 원하는 방을 탐색하여 해당 방이 비어있는지 find() 함수로 확인했습니다.

만약, 비어있다면 dictionary의 key에 방 번호, value에 key + 1을 저장하여 후에 이미 배정된 방을 원하는 고객이 있을 시 바로 해당 방의 다음방을 배정할 수 있도록 구현하였고, 비어있지 않다면 해당 방의 value 값을 다시 재귀 호출하여 비어있는 방을 찾아 문제를 해결했습니다.

 

중요했던 부분은 find() 함수에서 재귀 호출 시마다 경로 압축 최적화를 한다는 것인데 자식 노드들의 값을 모두 루트 노드로 바꿈으로써 탐색에 걸리는 시간 복잡도 효율이 높아져 효율성 테스트를 통과할 수 있었습니다.

또한, Python의 경우 sys.setrecursionlimit() 함수로 재귀 호출 깊이의 제한을 조절해 주셔야 런타임 에러가 발생하지 않습니다.


3) 코드

 

* Python 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import sys
sys.setrecursionlimit(10 ** 7)
input = sys.stdin.readline
 
 
def find(room, reservedRooms):
    if room not in reservedRooms:
        reservedRooms[room] = room + 1
        return room
    
    reservedRooms[room] = find(reservedRooms[room], reservedRooms)
    return reservedRooms[room]
 
 
def solution(k, room_number):
    answer = []
    reservedRooms = dict()
    
    for room in room_number:
        remainedRoom = find(room, reservedRooms)
        answer.append(remainedRoom)
        
    return answer

 

저작자표시 비영리 변경금지 (새창열림)

'Deprecated' 카테고리의 다른 글

[ALGOSPOT] 알고스팟 BOARDCOVER 게임판 덮기(Python)  (0) 2020.05.21
[programmers] 프로그래머스 징검다리 건너기(Python)  (0) 2020.05.18
[Baekjoon Online Judge] 백준 2170번 선 긋기(Python)  (0) 2020.05.17
[Algorithm] 유니온 파인드  (0) 2020.05.16
[Baekjoon Online Judge] 백준 1976번 여행 가자(Python)  (0) 2020.05.16
    'Deprecated' 카테고리의 다른 글
    • [ALGOSPOT] 알고스팟 BOARDCOVER 게임판 덮기(Python)
    • [programmers] 프로그래머스 징검다리 건너기(Python)
    • [Baekjoon Online Judge] 백준 2170번 선 긋기(Python)
    • [Algorithm] 유니온 파인드
    HelloMinchan
    HelloMinchan
    Though you should not fear failure, You should do your very best to avoid it.

    티스토리툴바