a1 = [(2, 5), (5, 5), (4, 5), (3, 5), (0, 3)]
a2 = [(2, 5), (5, 5), (4, 5), (3, 5), (0, 3)]
#sort()는 stable하지만, 애초에 input순서가 순서대로일거라는 보장이없어서 의미없음
a1.sort(key=lambda x: x[1]) #x[1]기준으로 오름차순, (단, x[0]은 신경 안씀)
a2.sort(key=lambda x: (x[1], -x[0])) #x[1]기준으로 오름차순, x[1]이 같을 경우엔 x[0]기준으로 내림차순
print(f"a1 : {a1}")
print(f"a2 : {a2}")
보통 리스트안에 컨테이너 변수들로 이뤄질때 sort를 이용하면 key=lambda x: x[?] 꼴로 많이 쓴다. 그렇다면 x[?]이 서로 같은 컨테이너 변수끼리라면 어떻게 정렬될까?
사실 python의 sort()는 stable하다. 따라서 list 순서가 그대로 보장되긴할텐데...
코테에선 input 순서에 어떠한 기대를 해선 안된다!
코테 문제에서 제공되는 TC(Test Case)들은 보통 우리의 상식대로의 순서로 주어진다. 하지만, 그렇지 않은 경우도 반드시 Custom한 TC로 따져봐야한다!
파이썬에선 다중 정렬(하나를 기준으로 정렬할때, 하나가 같은 경우라면 그 다음 key를 지정)하는 방법은 lambda x의 반환값을 튜플로한다! ex. (k1, k2, -k3)...
회의실 배정
해당 문제에서 end_time의 오름차순으로 정렬을 하고, start_time을 k2로 정렬을 명시하지 않고 풀었다.
따라서 이땐 [(0, 5), (5, 5), (4, 5), (2, 5), (3, 5)] 를 input 했을 땐 기댓값 3(이유 : (3, 5) -> (5, 5)가 가능해서 2번으로 침)과 달리 결과는 2로 나온다.
아래는 수정 전 코드
n = int(input())
times = []
for _ in range(n):
times.append(tuple(map(int, input().split())))
times.sort(key=lambda x: x[1]) #<- 문제!
#print(times)
answer = 0
iter_time = 0
for start_time, end_time in times:
if start_time < iter_time:
continue
iter_time = end_time
answer+=1
print(answer)
아래는 수정 후 코드
n = int(input())
times = []
for _ in range(n):
times.append(tuple(map(int, input().split())))
times.sort(key=lambda x: (x[1], x[0]))
#print(times)
answer = 0
iter_time = 0
for start_time, end_time in times:
if start_time < iter_time:
continue
iter_time = end_time
answer+=1
print(answer)