← 실전 문제

채널별 첫 공지 고르기

Python빈칸 채우기

공지 records의 각 항목은 [channel, urgency, time, id]예요. 전체 공지를 urgency가 큰 순서 → time이 작은 순서 → id가 작은 순서로 정렬해요. 정렬된 순서에서 채널별 첫 공지 하나만 선택하고, 선택된 공지의 id를 그 순서대로 반환해요.

solution(records)가 id 목록을 반환하도록 빈칸을 채워 주세요. 여러 번의 sort는 같은 키의 기존 순서를 유지해요.

매개변수와 반환값

  • 공지 수 n은 1500, channel은 1100, urgency는 15, time은 01,000이에요.
  • id는 1~10,000이고 모든 공지에서 서로 달라요.
  • 같은 채널의 공지가 여러 개일 수 있고 반환값 길이는 서로 다른 채널 수예요.

예시

  1. records = [[1, 3, 10, 40], [2, 5, 9, 30], [1, 5, 8, 20], [3, 5, 9, 10]]이면 결과는 [20, 10, 30]이에요.
  2. records = [[7, 2, 1, 9], [7, 2, 1, 3], [8, 2, 0, 5]]이면 결과는 [5, 3]이에요.

실행용 입출력

첫 줄에 n, 다음 n줄에 channel urgency time id를 입력해요. 반환 id를 한 줄에 출력해요.

예시 입력

4
1 3 10 40
2 5 9 30
1 5 8 20
3 5 9 10

예상 결과

20 10 30

예시 입력

3
7 2 1 9
7 2 1 3
8 2 0 5

예상 결과

5 3
핵심 개념
  • basic-sort-search: .sort(key=...)는 리스트 자체를 정렬해요. lambda item: item[3]는 한 공지에서 비교할 id를 꺼내는 짧은 함수예요. reverse=True이면 그 키가 큰 값부터 정렬해요.
  • counting-aggregation: used = set()은 이미 선택한 채널을 저장해요. in·not in으로 확인하고 .add(channel)로 기록해요.
  • array-1d: [record[:] for record in records]는 각 공지 리스트도 복사해 원래 records의 순서를 유지해요. for channel, urgency, time, identity in ordered는 네 항목을 각각의 변수로 나누어 읽어요.

Python 정렬은 안정 정렬이에요. 같은 키끼리는 직전 순서를 유지하므로 여러 번 정렬할 때 우선순위가 낮은 키부터 적용해요. 높은 우선순위부터 정렬하면 다음 정렬이 그 순서를 다시 바꿀 수 있어요.

입력 하네스의 input()은 한 줄의 문자열을 읽고, .split()은 공백으로 항목을 나눠요. map(int, ...)는 각 항목을 정수로 바꾸고 list(...)는 그 결과를 리스트로 모아요. range(n)은 0부터 n-1까지 반복해요. 하네스는 함수 호출을 위한 자체 연결이며 풀이의 반환 계약과 구분해요.

코드 작성과 채점은 로그인 후 이용해요

로그인하고 풀기