julia coding story

[프로그래머스] 호텔 대실 본문

카테고리 없음

[프로그래머스] 호텔 대실

julia-biolat 2025. 3. 26. 22:32
728x90

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

 

프로그래머스

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

programmers.co.kr

 

 

이거는 그냥 풀면됨. 

 

알아야할것

1. split

2. sort(key = lambda x:(x[1], x[0]))

 

이것만 알면 풀 수 있음

 

근데 풀면서 신기한거 앎. 

 

바로 Remove()함수의 위험성,,

이상하게 첫 시도 코드로 하니까 실제 테스트1 만 통과안되는거;; 그래서 ㄹㅇ 뭐지뭐지 로직 문제 없는데 하다가

시간 다감;;

 

첫 코드

def solution(book_time):
    answer = 0
    
    start = []
    end = []
    minC = []
    
    for i in book_time:
        a = i[0].split(':')
        b = i[1].split(':')
        minA = int(a[0])*60 + int(a[1])
        minB = int(b[0])*60 + int(b[1])
        minC.append([minA, minB])
        
    while True:
        minC.sort(key = lambda x:(x[1], x[0]))
        answer += 1
        t = minC.pop(0)[1]
        minC.sort(key = lambda x:(x[0], x[1]))
    
        for i in minC:
            if t+10 <= i[0]:
                t = i[1]
                minC.remove(i)
                
        if len(minC) == 0:
            break
        
    return answer

print(solution([["10:00", "10:30"], ["10:10", "10:40"], ["10:20", "10:50"], ["10:30", "11:00"]]))

 

 

이 패턴은 for문 돌리면서 리스트를 조작하잖아?
이건 순회 누락될 수 있는 구조라,
파이썬 내부 동작을 잘 알지 않으면 언젠가 진짜 무너질 수 있어.

for i in minC:
    if t+10 <= i[0]:
        t = i[1]
        minC.remove(i)

 

for i in minC:
이게 minC를 인덱스로 순회하지 않고, 내부에서 iterator로 순회 중인데,
중간에 요소를 remove() 하면 그 다음 인덱스가 건너뛰어질 수도 있어.

 

그래서 for를 쓸 때는 remove를 바로 하는 것 보다 필터링하는게 좋음

new_minC = []
for i in minC:
    if t + 10 <= i[0]:
        t = i[1]
    else:
        new_minC.append(i)
minC = new_minC

이런식으로 !

 

두번째 (정답)

def solution(book_time):
    answer = 0
    
    start = []
    end = []
    minC = []
    
    for i in book_time:
        a = i[0].split(':')
        b = i[1].split(':')
        minA = int(a[0])*60 + int(a[1])
        minB = int(b[0])*60 + int(b[1])
        minC.append([minA, minB])
        
    while True:
        new_min = []
        if len(minC) == 0:
            break
        minC.sort(key = lambda x:(x[1], x[0]))
        answer += 1
        t = minC.pop(0)[1]
        minC.sort(key = lambda x:(x[0], x[1]))
    
        for i in minC:
            if t+10 <= i[0]:
                t = i[1]
            else:
                new_min.append(i)
        minC = new_min
        if len(minC) == 0:
            break
        
    return answer