[1스4코1파] 1명의 스위프트 개발자와 4명의 코틀린 개발자, 1명의 파이썬 개발자코딩 테스트 서막 : 1스4코1파

Rule :

하루에 1문제씩 풀기.
한 문제당 30분씩은 고민하기.
왜 그렇게 풀었는지 공유하기.
하루라도 놓친다면 벌금은 1,000원
백준 플래티넘, 프로그래머스 4단계, 개발자 탈퇴 시 모임 탈퇴 가능

START :

[3코1파] 2023.01.04~ (103일차)
[4코1파] 2023.01.13~ (94일차)
[1스4코1파] 2023.04.12~ (5일차)

Today :

2023.04.16 [103일차]

프로그래머스 LV 2
호텔 대실
https://school.programmers.co.kr/learn/courses/30/lessons/155651

문제 설명

호텔을 운영 중인 코니는 최소한의 객실만을 사용하여 예약 손님들을 받으려고 합니다. 한 번 사용한 객실은 퇴실 시간을 기준으로 10분간 청소를 하고 다음 손님들이 사용할 수 있습니다.
예약 시각이 문자열 형태로 담긴 2차원 배열 book_time이 매개변수로 주어질 때, 코니에게 필요한 최소 객실의 수를 return 하는 solution 함수를 완성해주세요.

제한사항

1 ≤ book_time의 길이 ≤ 1,000
book_time[i]는 ["HH:MM", "HH:MM"]의 형태로 이루어진 배열입니다
[대실 시작 시각, 대실 종료 시각] 형태입니다.
시각은 HH:MM 형태로 24시간 표기법을 따르며, "00:00" 부터 "23:59" 까지로 주어집니다.
예약 시각이 자정을 넘어가는 경우는 없습니다.
시작 시각은 항상 종료 시각보다 빠릅니다.

입출력 예

입출력 예 설명

입출력 예 #1

위 사진과 같습니다.
입출력 예 #2
첫 번째 손님이 10시 10분에 퇴실 후 10분간 청소한 뒤 두 번째 손님이 10시 20분에 입실하여 사용할 수 있으므로 방은 1개만 필요합니다.
입출력 예 #3
세 손님 모두 동일한 시간대를 예약했기 때문에 3개의 방이 필요합니다.

문제 풀이 방법

일단 시간이 나오면 무조건 분이나 초단위로 바꿔줘야 하므로, 시간들을 분으로 바꿔서 오름차순으로 정렬했다.
정렬한 시간을 돌면서 인덱스를 이용해서 마지막 시간과 들어오는 시간을 비교해서 룸을 추가하거나, 기존에 있는 룸에 있으면 넣거나 해서 룸의 개수를 구하려고 했는데 구현에 실패함..
(그거 구현한 사람 아래 다른 사람 풀이에 넣어 둠)

그래서 다른 방법으로, 일단 시간순으로 오름차순한 걸
start 시간과 end시간+10 청소시간까지 더해서 1분당 어차피 돌아가니까 딕셔너리에 시간을 다 더해서 가장 max를 return 하는 걸로 풀었다. 걸리는 시간 꼬라지 보니까 효율적인 코드는 아닌 것 같아서 찾아보니까 힙으로 풀면 좋을 것 같다... 오우~! 굿

내 코드

def solution(book_time):

    time_rooms = []
    rooms = dict()

    for bt in book_time:
        start, end = bt
        start = int(start.split(':')[0])*60+int(start.split(':')[1])
        end = int(end.split(':')[0])*60+int(end.split(':')[1])    
        time_rooms.append((start, end))

    for time in time_rooms:
        start, end = time

        for t in range(start, end+10):
            if rooms.get(t) == None:
                rooms[t] = 1
            else:
                rooms[t] +=1

    
    return  max(rooms.values())

증빙

다른 사람 풀이

enumerate로 index를 이용해서 푼 풀이
내가 처음에 구현하려던게 이거였는딩..

heap으로 푼 새럼

여담

출근싫어 호텔청소싫어

profile
꿈꾸는 것도 개발처럼 깊게

0개의 댓글