https://www.acmicpc.net/problem/11652
시간 1초, 메모리 256MB
input :
숫자 카드의 개수 N (1 <= N <= 100,000)
정수가 주어짐.
output :
가장 많이 가지고 있는 정수를 출력한다.
조건 :
적혀있는 수는 (-2^62 <= 숫자 <= 2^62)
가장 많이 가지고 있는 수가 여러 가지이면, 작은 것을 출력한다.
2^62 = 4,611,686,018,427,388,000 WOW...에메이징.
숫자의 길이만큼 리스트를 만드는 건 불가능.
입력을 받을 때 튜플로 저장을 해서 (정수, 입력받은 횟수) 기록을 한 후
[입력받은 횟수] 기준으로 내림 차순 정렬, [정수] 기준 오름 차순 정렬 해서.
제일 처음 인덱스를 출력해주자.
최대 길이 100,000 의 리스트를 만들어서 정렬 두번.
리스트를 이용할 경우. 숫자 값으로 인덱스를 찾기 어렵다.
딕셔너리를 이용하는건 어떨까.
정답 코드 :
N = int(input())
number = {}
for i in range(N):
data = int(input())
if data in number:
number[data] += 1
else:
number[data] = 1
answer = sorted(number.items(), key = lambda x : (-x[1], x[0]))
print(answer[0][0])
딕셔너리가 아닌 Counter를 이용하는 방법도 존재한다.
counter 란 리스트, 문자열등을 입력 받아서 그 내부에 어떤 아이템들이 존재하는지를 세아려주는 클래스인데 편하다.
그리고 이 문제 조건중에 개수가 동일하면 작은 숫자를 출력한다고 했기 때문에 우선적으로 모든 아이템들을 정렬해주어야 한다.
import sys
from collections import Counter
n = int(sys.stdin.readline())
data = []
for i in range(n):
data.append(int(sys.stdin.readline()))
cnt = Counter(sorted(data)).most_common(1)
print(cnt[0][0])
언제나 pypy3로 해야 좀 빠른건가.... 너무 많이 걸린다 기다리는 시간이.