본문 바로가기
Problem Solving/백준

[백준|파이썬] 5766: 할아버지는 유명해! (실버4)

by 청량리 물냉면 2023. 4. 14.
반응형
문제

https://www.acmicpc.net/problem/5766

 

5766번: 할아버지는 유명해!

각 테스트 케이스마다,  당신의 프로그램은 한 행에 2등인 선수(들)의 번호를 출력해야 합니다. 2등인 선수가 두 명 이상인 경우(동점자 발생), 각 선수 번호를 공백으로 구분하여 오름차순으로

www.acmicpc.net

 

 

🐍파이썬
import sys
while True:
    n, m = map(int, sys.stdin.readline().split())
    if n == 0 and m == 0:
        break
    player = {}	#(player번호:cnt갯수)로 이루어진 dic생성
    for _ in range(n):
        p = list(map(int, sys.stdin.readline().split()))
        for i in p:	
            if i in player:	#사전에 존재하는 선수 번호일 경우
                player[i] += 1	#카운트 +1
            else:	#사전에 존재하지 않는 선수일 경우
                player[i] = 1	#1로 초기화
    #선수의 정보를 담은 사전을 value기준으로 내림차순, value가 동일하다면 key기준으로 오름차순 정렬
    player = sorted(player.items(), key = lambda x:(-x[1], x[0]))
    #1등 선수(문제조건에 1명으로 고정돼있음) 제외한 2등 선수의 점수를 score에 저장
    score = player[1][1]
    #전체 리스트를 돌며 score와 동일한 값을 지닌 선수들을 출력
    for i in player:
        if i[1] == score:
            print(i[0], end=' ')
    #줄바꿈
    print()
더보기

n, m을 while문 밖에서 입력받아서 입력값에 오류가 났는데 이걸 눈치채는 데 1시간 넘게 걸렸다...😭

기본조건이 문제에 맞게 구현 잘 됐는지 꼭 확인하자.

 

 

다른 풀이 방법

import sys
input = sys.stdin.readline

while True:
    n, m = map(int, input().split())
    arr = [0] * 10005
    res = []
    if n == 0 and m == 0:
        break
	
    for _ in range(n):
        data = list(map(int, input().split()))
        #arr배열에서 data값에 해당하는 인덱스에 +1
        for num in data:	
            arr[num] += 1
	#arr에서 가장 큰 수
    first = max(arr)
	#선수번호 1~10001까지 반복
    for i in range(1, 10001):
        if arr[i] == first:	#first와 값이 같다면
            arr[i] = 0	#0으로 초기화
	#가장 큰 수를 0으로 초기화했으므로 두번째 값이 가장 큰 수가 되었음
    second = max(arr)
	#전체 선수 중 2등 점수를 가지고 있는 선수들을 res에 저장
    for i in range(1, 10001):
        if arr[i] == second:
            res.append(i)
	#res 값을 출력
    print(*res)

 

반응형