[백준] 11652번 카드 (Python3)

Song_Song·2021년 5월 23일
0
post-thumbnail

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

카드의 번호가 주어지고, 가장 많이 가지고 있는 카드의 숫자를 출력하는 문제. (개수가 중복일 경우 가장 작은 수를 출력)

나의 첫 번째 풀이

  1. 입력받은 카드의 개수를 해시값으로 표현해주고
  2. 카드의 개수를 정렬하여(큰 값이 가장 먼저 나오도록 역순으로 정렬)
  3. 개수가 가장 많은 카드 중 가장 작은 수를 출력

위 로직을 구현해 보았다.

import sys

n = int(sys.stdin.readline())
dic = {}
answer_nums = []

for i in range(n): #딕셔너리로 가지고 있는 카드와 개수를 표현
    input_num = int(sys.stdin.readline())

    if input_num not in dic.keys():
        dic[input_num] = 1
    else:
        dic[input_num] += 1

dic_list = sorted(dic.items(), key=lambda x : x[1], reverse=True) #카드의 개수를 기준으로 역순으로 정렬

biggest = dic_list[0][1] # 
answer_nums.append(dic_list.pop(0)[0])
while len(dic_list) != 0:
    next_biggest= dic_list[0][1]
    if biggest != next_biggest:
        break
    else:
        answer_nums.append(dic_list.pop(0)[0])

answer_nums.sort()
print(answer_nums.pop(0))

딕셔너리를 sorted() 함수를 사용하면 다음과 같이 리스트 형태로 정렬된다.
[(3, 3), (2, 3), (1, 1)]

value 값을 기준으로 정렬을 하였기 때문에 key 값에 해당되는 3, 2 는 입력이 들어온 순서대(stable sorting) 정렬이 된다.

그래서 마지막 bigget부터는 value가 가장 큰 값들 중에서 key값이 가장 작은 값을 출력하는 로직을 구현하였다.

하지만, 이 코드들은 필요가 없었다. sorted()함수로 정렬을 할 때 lambda에 조건을 두개를 넣으면 간단하게 풀 수 있었다.

나의 두 번째 풀이

import sys

n = int(sys.stdin.readline())
dic = {}
answer_nums = []

for i in range(n):
    input_num = int(sys.stdin.readline())

    if input_num not in dic.keys():
        dic[input_num] = 1
    else:
        dic[input_num] += 1

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

{key:value} 형식의 딕셔너리에서 위와 같이 정렬을 하면 value가 큰 값부터 정렬한 뒤에 key가 작은 값부터 정렬하기 때문에 정렬된 가장 첫 번째에 놓인 key값을 출력하면 답을 쉽게 구할 수 있다.

이는 코드도 훨씬 짧고, 시간도 훨씬 적게 사용하면서 간단하게 풀 수 있는 방법이다.

profile
성장을 위한 정리 블로그

0개의 댓글