본문 바로가기

백준11652 - 카드 (정렬) Python 본문

개발/algorithm

백준11652 - 카드 (정렬) Python

자전하는명왕성 2023. 11. 4. 09:31

문제는 다음과 같이 '가장 많이 보유하고 있는 정수'를 구하되, 여러가지라면 가장 값이 작은 정수를 출력하는 문제다.

 

풀이 방식은 다음과 같다.

먼저 가지고 있는 정수의 수를 헤아리기 위해, Counter 메서드를 사용하거나, 딕셔너리에 직접 데이터를 대입하여 구할 수도 있다.

# Counter 메서드
_count = Counter(data)
  
# 딕셔너리 
_dic = {}
for v in data :
  _dic[v] = _dic.get(v, 0) + 1

 

이후 정렬이 필요한데, 객체 자체를 정렬하는 기능은 없기에, 2차원 배열로의 변환이 필요하다.

# 2차원 배열로 변환
_arr = [[key, value] for key, value in _count.items()]
#_count.items() 를 활용하여 _count에 있는 모든 key, value 를 가져옴


# 정렬
_arr.sort(key=lambda x : [-x[1], int(x[0])])
# 이때 lambda x 이후에 오는 배열은 정렬 우선 순위를 의미하며 (-)인자는 내림차순을 의미
# 따라서 x[1]인 value 값 내림차순 정렬 => x[0]인 key 값 오름차순 정렬

 

딕셔너리.item() 함수의 의미를 이해하고 있다면, 배열 선언 없이 다음과 같이 정렬도 가능하다.

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

 

이후 해당 정렬된 배열에서 가장 앞에 있는 인자의 첫 요소를 출력하면, 가장 많이 보유하고 있는 정수 중 가장 작은 값이 출력된다.

 

전체 소스 코드

import sys
data_temp = sys.stdin if sys.platform == 'linux' else open('입력.txt', 'r')
input_data = data_temp.read().splitlines()

from collections import Counter

def solution (data) :
  data.pop(0)
  _count = Counter(data)
  
  _sort = sorted(_count.items(), key=lambda x : [-x[1],int(x[0])])
  print(_sort[0][0])
  
solution(input_data)
Comments