728x90
시간 제한 1초, 메모리 제한 256MB
# 조건
- IBA(국제 브릿지 협회)는 수 년간, 매주 가장 실력있는 선수들의 랭킹 정보를 기록해왔습니다.
- 매주 랭킹에 선수의 이름이 오를 때마다 선수의 포인트가 1포인트씩 오르는데, 할아버지께서 가장 많은 포인트를 얻어서 최고의 브릿지 선수로 선정되었습니다.
- 할아버지께는 그와 브릿지 순위를 경쟁하는 친구들이 많이 있었기 때문에, 할아버지는 어떤 선수(들)가 2등을 했는지 정말 궁금하셨습니다.
- IBA 랭킹 정보는 이제 온라인에 올라와 있고, 할아버지께서 당신에게 도움을 요청했습니다.
- 당신은 매주마다의 랭킹 정보 리스트를 인풋으로 받아 2등 선수가 누구인지 알아내는 프로그램을 짜야 합니다.
입력
- 각 선수는 1~10000까지의 정수(선수 번호)로 식별됩니다.
- 인풋은 여러 테스트 케이스들로 구성됩니다.
- 테스트 케이스의 첫 행에는 두 정수 N과 M이 주어지는데, 다음 행부터 N(2<=N<=500)주 동안의 매주 상위 M(2<=M<=500)명의 랭킹 정보가 주어짐을 의미합니다.
- 그 다음 N행의 인풋이 주어지는데 각 행은 한 주의 랭킹 정보입니다.
- 각 행은 공백으로 구분되는 M개의 정수들이 주어집니다.
- 각 테스트 케이스에는 최고점의 선수가 단 한 명만 존재합니다.
- 매주마다의 랭킹 정보에는 서로 다른 M개의 선수 번호가 주어집니다.
- N과 M이 모두 0으로 주어지는 행이 인풋의 마지막입니다.
출력
- 각 테스트 케이스마다, 당신의 프로그램은 한 행에 2등인 선수(들)의 번호를 출력해야 합니다.
- 2등인 선수가 두 명 이상인 경우(동점자 발생), 각 선수 번호를 공백으로 구분하여 오름차순으로 출력해야 합니다.
# 접근 방법
- 최고점은 1명밖에 없으며, 2등은 여러 명이 나올 수 있으며 이 경우 2등의 번호를 오름차순으로 출력해야되는 문제이다.
- 1~10000까지의 번호가 존재할 수 있으므로 10001크기의 ranking 리스트를 만들어준다.
- 이후 주어지는 주간 랭킹의 번호들을 인덱스로 +1 씩 해준다.
- 모든 주간 랭킹을 기록했다면, ranking을 set 자료구조로 바꾼 후, sorted를 이용하여 내림차순 정렬해줌으로써 2번째로 높은 포인트를 얻어준다.
- 순회하며 second 포인트와 같은 선수들의 번호를 출력해준다.
import sys
sys.stdin = open('input.txt')
input = sys.stdin.readline
def solve():
while True:
N, M = map(int, input().split())
if not N and not M:
break
ranking = [0] * 10001
for _ in range(N):
for i in list(map(int, input().split())):
ranking[i] += 1
total = sorted(set(ranking), reverse=True)
second = total[1]
for i, j in enumerate(ranking):
if j == second:
print(i, end=' ')
print()
if __name__ == '__main__':
solve()
728x90
'ALGORITHM > 정렬, 탐색,구현' 카테고리의 다른 글
[백준 2018번] 파이썬 - 수들의 합 5 (2) | 2024.01.28 |
---|---|
[백준 2847번] 파이썬 - 게임을 만든 동준이 (1) | 2024.01.25 |
[백준 20665번] 파이썬 - 독서실 거리두기 (1) | 2024.01.13 |
[백준 9242번] 파이썬 - 폭탄 해체 (0) | 2024.01.12 |
[백준 20159번] 파이썬 - 동작 그만. 밑장 빼기냐? (0) | 2024.01.10 |