BOJ 11652 카드

LONGNEW·2020년 12월 25일
0

BOJ

목록 보기
5/333

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로 해야 좀 빠른건가.... 너무 많이 걸린다 기다리는 시간이.

0개의 댓글