# -> (1,4), (5,7), (8,11), (12,14) 이용 가능
# => 사용 가능한 회의의 최대 개수: 4
## 의사코드 ##
# 다음 회의의 시작 시간이 이전 회의의 끝나는 시간보다 작으면 사용 불가
# -> 다음 회의의 시작 시간과 사용 가능한 이전 회의의 끝나는 시간 비교
# cnt = 1 # 사용 가능한 회의의 최대 개수(맨 첫 번째 회의는 사용 가능)
# time = [] # 전체 회의 시간을 담을 리스트
# available = [] # 사용 가능한 회의를 담을 리스트
# for i in range(1, n):
# end_time = available[-1][1] # 사용 가능한 이전 회의의 끝나는 시간
# # 다음 회의 시작 시간이 사용 가능한 이전 회의의 끝나는 시간 보다 작은 경우 continue
# if time[i][0] < end_time:
# continue
# # 다음 회의가 사용 가능한 경우
# else:
# cnt += 1 # 사용 가능한 회의의 최대 개수 + 1
# available.append(time[i]) # 사용 가능 리스트에 time[i](다음 회의) 삽입
첫 번째 시도
n = int(input())
cnt = 1 # 사용 가능한 회의의 최대 개수(맨 첫 번째 회의는 사용 가능)
time = [] # 전체 회의 시간을 담을 리스트
available = [] # 사용 가능한 회의를 담을 리스트
# 회의 시간을 time 리스트에 담기
for i in range(n):
start, end = map(int, input().split())
time.append((start, end)) # [(시작 시간, 끝나는 시간)]
# 맨 첫 번째 회의를 사용 가능 리스트에 삽입
available.append(time[0])
for i in range(1, n):
# 사용 가능한 이전 회의의 끝나는 시간
end_time = available[-1][1] # 사용 가능 리스트의 맨 마지막 원소의 index 1
# 다음 회의 시작 시간이 사용 가능한 이전 회의의 끝나는 시간 보다 작은 경우 continue
if time[i][0] < end_time:
continue
# 다음 회의가 사용 가능한 경우
else:
cnt += 1 # 사용 가능한 회의의 최대 개수 + 1
available.append(time[i]) # 사용 가능 리스트에 time[i](다음 회의) 삽입
print(cnt)
-> 틀림
통과한 코드
n = int(input())
time = [] # 전체 회의 시간을 담을 리스트
# 회의 시간을 time 리스트에 담기
for i in range(n):
start, end = map(int, input().split())
time.append((start, end)) # [(시작 시간, 끝나는 시간)]
# 끝나는 시간을 오름차순으로 정렬한 후, 시작 시간을 오름차순 정렬
time.sort(key=lambda x: (x[1], x[0]))
cur_end_time = 0 # 현재 회의의 끝나는 시간
cnt = 0 # 사용 가능한 회의의 최대 개수
for start, end in time:
# 현재 끝나는 시간이 다음 회의의 시작 시간과 같거나 작은 경우
if cur_end_time <= start:
cur_end_time = end # 현재 끝나는 시간을 다음 회의의 끝나는 시간으로 변경
cnt += 1 # 사용 가능한 회의의 최대 개수 + 1
print(cnt)
-> 끝나는 시간을 오름차순으로 정렬 후, 시작 시간 오름차순 정렬 추가, 사용 가능한 회의의 끝나는 시간을 리스트에 따로 저장하지 않고 조건에 맞으면 새로운 끝나는 시간으로 변경
끝나는 시간 오름차순 정렬 후, 시작 시간 오름차순 정렬
# 끝나는 시간을 오름차순으로 정렬한 후, 시작 시간을 오름차순 정렬
time = [(3, 3), (1, 3)]
time.sort(key=lambda x: (x[1], x[0]))
print(time)
"""
[(1, 3), (3, 3)]
"""
-> 두 회의의 끝나는 시간이 같은 경우, 시작 시간이 더 빠른 순서대로 정렬되어야 함
그래서 끝나는 시간을 기준으로 먼저 오름차순 정렬 후, 다시 시작 시간을 기준으로 오름차순으로 한 번 더 정렬
과정 확인
n = 11
time = [(1, 4), (3, 5), (0, 6), (5, 7), (3, 8), (5, 9), (6, 10), (8, 11), (8, 12), (2, 13), (12, 14)]
"""
현재 끝나는 시간: 0
다음 회의의 시작 시간: 1
사용 가능한 회의의 최대 개수: 0
--------------------------------------------------
변경된 현재 끝나는 시간: 4
사용 가능한 회의의 최대 개수: 1
--------------------------------------------------
현재 끝나는 시간: 4
다음 회의의 시작 시간: 3
사용 가능한 회의의 최대 개수: 1
현재 끝나는 시간: 4
다음 회의의 시작 시간: 0
사용 가능한 회의의 최대 개수: 1
현재 끝나는 시간: 4
다음 회의의 시작 시간: 5
사용 가능한 회의의 최대 개수: 1
--------------------------------------------------
변경된 현재 끝나는 시간: 7
사용 가능한 회의의 최대 개수: 2
--------------------------------------------------
현재 끝나는 시간: 7
다음 회의의 시작 시간: 3
사용 가능한 회의의 최대 개수: 2
현재 끝나는 시간: 7
다음 회의의 시작 시간: 5
사용 가능한 회의의 최대 개수: 2
현재 끝나는 시간: 7
다음 회의의 시작 시간: 6
사용 가능한 회의의 최대 개수: 2
현재 끝나는 시간: 7
다음 회의의 시작 시간: 8
사용 가능한 회의의 최대 개수: 2
--------------------------------------------------
변경된 현재 끝나는 시간: 11
사용 가능한 회의의 최대 개수: 3
--------------------------------------------------
현재 끝나는 시간: 11
다음 회의의 시작 시간: 8
사용 가능한 회의의 최대 개수: 3
현재 끝나는 시간: 11
다음 회의의 시작 시간: 2
사용 가능한 회의의 최대 개수: 3
현재 끝나는 시간: 11
다음 회의의 시작 시간: 12
사용 가능한 회의의 최대 개수: 3
--------------------------------------------------
변경된 현재 끝나는 시간: 14
사용 가능한 회의의 최대 개수: 4
--------------------------------------------------
4
"""