julia coding story
[프로그래머스] 호텔 대실 본문
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