본문 바로가기

Algorithm & SQL/Baekjoon

[Algorithm] [Python] 백준/BOJ - 11652 _ 카드

11652 - 카드

문제


준규는 숫자 카드 N장을 가지고 있다. 숫자 카드에는 정수가 하나 적혀있는데, 적혀있는 수는 -2^62보다 크거나 같고, 2^62보다 작거나 같다.

준규가 가지고 있는 카드가 주어졌을 때, 가장 많이 가지고 있는 정수를 구하는 프로그램을 작성하시오. 만약, 가장 많이 가지고 있는 정수가 여러 가지라면, 작은 것을 출력한다.

입력


첫째 줄에 준규가 가지고 있는 숫자 카드의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개 줄에는 숫자 카드에 적혀있는 정수가 주어진다.

출력


첫째 줄에 준규가 가장 많이 가지고 있는 정수를 출력한다.


제출 코드


from sys import stdin

n = int(stdin.readline())

value = dict()

for _ in range(n):
    tmp = int(stdin.readline())
    if tmp in value:
        value[tmp] += 1
    else:
        value[tmp] = 1

print(sorted(value.items(), key=lambda x: (-x[1], x[0]))[0][0])

문제 풀이


위 문제 풀이의 핵심은 정렬이다.

필자는 값의 빈도수를 파악하기 위해 Dictionary 자료형을 사용하였다.

key에 정수값, value에 해당 정수의 빈도수를 저장하였다.

이후 딕셔너리 정렬을 진행한다. 진행시 문제에 주어진 조건과 같이 제일 많은 빈도수를 가진 정수를 제일 앞으로, 만일 최다빈도의 정수가 여러개라면, 작은 것을 먼저 출력할 수 있도록 정렬한다.

다만 딕셔너리 자체를 정렬할 수는 없으므로, 리스트로 변환하여 정렬을 진행한다.

sorted(value.items(), key=lambda x: (-x[1], x[0]))

위 코드 한 줄이 문제 풀이의 핵심인 것 같다.

이후 정렬된 리스트의 첫번째 원소의 첫번째 값을 출력해준다.