[Python] 백준 11652번 풀이 / 카드 / sorted()에서의 key lambda 사용하기

문제

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

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

입력

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

출력

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

예제 입력 1

5
1
2
1
2
1

 

예제 출력 1

1

 

 

 

틀렸던 코드
import sys
input = sys.stdin.readline

n = int(input())
arr = []
for i in range(n):
  arr.append(int(input()))

arr.sort()
cnt =[0] * (n+1)

for i in range(len(arr)):
  cnt[arr[i]] += 1

print(cnt.index(max(cnt)))

처음에는 계수정렬을 사용하여 

 (1) cnt = ( n + 1) * [0] 를 사용하여 입력된 카드의 갯수를 저장하고,

(2) cnt에서 가장 큰 수의 인덱스를 출력하고자 했지만

index error가 발생했다.

계수정렬은 모든 수가 0이상의 수 일때만 가능하지만, 해당 문제에선 음수카드도 있었기 때문에 에러가 발생했다

어떻게 해야하나 찾아보니

딕셔너리에 카드와 카드갯수를 담고, 카드갯수를 내림차순 후, 카드번호를 오름차순하면 된다

 

 

 

import sys
input = sys.stdin.readline

n = int(input())
dic = {} //카드번호, 카드 갯수를 담을 딕셔너리

for i in range(n):
  card = int(input())
  if card in dic: #이미 딕셔너리에 카드가 있다면
    dic[card] +=1 # 카드의 갯수를 1개 더 추가, { 4:1, 5:2, 2:3 } 이런식으로 카드가 몇개 있는지 담음
  else: 
    dic[card] = 1

#dic.items(): 변수에 튜플로 이루어진 리스트를 담는다
# ex) result [(4,1), (5,2), (2,3)] 람다식을 이용하여 갯수를 먼저 내림차순하고, 
# card을 오름차순하여 갯수가 같으면 작은 수가 출력될 수 있게 정렬한다
# 람다식은 먼저 쓴 것을 우선순위로 정렬함, 1번째 인덱스(카드갯수)를 내림차순 하고, 0번째 인덱스를 오름차순
result = sorted(dic.items(), key = lambda x:(-x[1],x[0]))

#result의 첫번째 튜플 인덱싱(1개만 추출)
print(result[0][0])

 

sorted(arr, key = lambda x:(어떻게 정렬할 것인지) )

 

(1) arr엔 정렬할 배열을 넣는다

=> (해당 코드에선 dic.items를 사용하여 딕셔너리 값을 리스트에 담았다)

 

(2) lambda x: (               ) 괄호에 작성한 코드 순서대로 정렬한다.

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

1. -x[1] 1번째 인덱스(카드갯수)를 내림차순 하고,

*****      -를 붙이면 내림차순 정렬이 된다

2. x[0] 0번째 인덱스(카드번호)를 오름차순한다.

람다식과 딕셔너리에 대해 이해가 안되어 정답코드를 보고서도 3시간은 헤맸다.... 하하