-
[Python] BOJ 1931 : 회의실 배정코딩테스트/백준 2024. 9. 24. 08:05
요구사항
- 1개의 회의실에 N개의 회의가 있을 때, 회의실을 사용할 수 있는 최대 개수를 출력
- 회의가 끝남과 동시에 시작할 수 있다.
설계
- 끝나는 시간 순서대로 오름차순 정렬하고 만약 끝나는 시간이 같다면 시작 시간으로 오름차순 정렬한다.
- 만약에 끝나는 시간과 그 다음 시작 시간이 같다면 count += 1 해준다.
- 같지 않다면 그 다음 시간과 비교해준다.
파이썬 문법 배우기
sort_meetings = sorted(meetings lambda: x [meetings[1], meetings[0]])
- 인자를 받아 끝나는 시간과 시작하는 시간으로 오름차순 정렬 하고 싶었던 의도다.
- 하지만 위 경우 sorted() 함수의 key 라는 인자를 받아 정렬하지만 빠져있다.
sort_meetings = sorted(meetings, key = lambda x : (x[1], x[0]))
- 왜인지 모르겠지만 위 소스 코드처럼 정렬을 했을 때, 끝나는 시간이 앞에 올 거 같은 착각을 불러 일으키지만, 그렇지 않다.
구현
import sys input = lambda: sys.stdin.readline().rstrip() N = int(input()) meetings = [list(map(int, input().split())) for _ in range(N)] sorted_meetings = sorted(meetings, key=lambda x: (x[1], x[0])) # 회의 선택 카운트 및 마지막으로 선택된 회의의 종료 시간 count = 0 last_end_time = 0 for meeting in sorted_meetings: start, end = meeting if start >= last_end_time: count += 1 last_end_time = end print(count)
2024.10.01 다시 풀어보기
def find_max(meettings): meettings = sorted(meettings, key=lambda x: (x[1],x[0])) end_time = 0 count = 0 for start, end in meettings: if start >=0: count += 1 end_time = end return count import sys input = lambda: sys.stdin.readline().rstrip() N = int(input()) meettings = [list(map(int, input().split()) for _ in range(N))] print(find_max(meettings))
- ValueError : too many values to unpack (expected 2)
- 본래 의도는 meettings를 순회하면서 각 원소들의 시작 시간과 종료 시간을 받아오는 것이였다.
- 하지만 start, end 인자값으로 meettings 리스트 그 자체가 들어가서 생긴 오류이다. (++아래 추가 설명 있습니다.)
- 그래도 같은 오류가 발생
# 입력 N = int(input()) meettings = [list(map(int, input().split()) for _ in range(N))] #print(find_max(meettings)) print(meettings) # 출력 [[<map object at 0x00000247E58EB970>, <map object at 0x00000247E58EB910>, <map object at 0x00000247E58EB8B0>, <map object at 0x00000247E58EB850>, <map object at 0x00000247E58EB7F0>, <map object at 0x00000247E58EB790>, <map object at 0x00000247E58EB700>, <map object at 0x00000247E58EB670>, <map object at 0x00000247E58EB5E0>, <map object at 0x00000247E58EB550>, <map object at 0x00000247E58EB4C0>]]
- 현재 meettings 리스트가 map 주소값을 리턴하고 있다.
- 괄호의 위치가 잘못 되었다.
meettings = [list(map(int, input().split())) for _ in range(N)]
- 위 소스 코드로 바꾸어 원하는 의도 맞게 올바르게 출력하고 있지만, count 값이 11을 리턴한다.
- 그 이유는 if start >=0 클 때, 여서 그런 듯 하다. start >= end_time 으로 바꾸어 주면 될 거 같다.
최종 소스 코드
def find_max(meettings): meettings = sorted(meettings, key=lambda x: (x[1],x[0])) end_time = 0 count = 0 for meetting in meettings: start, end = meetting if start >=end_time: count += 1 end_time = end return count import sys input = lambda: sys.stdin.readline().rstrip() N = int(input()) meettings = [list(map(int, input().split())) for _ in range(N)] print(find_max(meettings))
+ 추가로
def find_max(meettings): meettings = sorted(meettings, key=lambda x: (x[1],x[0])) end_time = 0 count = 0 for start, end in meettings: if start >=end_time: count += 1 end_time = end return count import sys input = lambda: sys.stdin.readline().rstrip() N = int(input()) meettings = [list(map(int, input().split())) for _ in range(N)] print(find_max(meettings))
- 처음 ValueError 원인이 start, end 값을 2개 기대 했는 데 그 이상이라 오류가 났다고 생각했었다.
- 그래서 다시 한 번 바꾸어서 시도해봤는 데 원하는 의도대로 결과가 출력이 된다.
'코딩테스트 > 백준' 카테고리의 다른 글
[Python] BOJ 13305 : 주유소 (1) 2024.09.24 [Python] BOJ 1541 : 잃어버린 괄호 (0) 2024.09.24 [Python] BOJ 1929 : 소수 구하기 (0) 2024.09.23 [Python] BOJ 4134 : 다음 소수 (0) 2024.09.23 [Python] BOJ 2485 : 가로수 (0) 2024.09.23