[백준알고리즘] 11652번: 카드 -Python
https://www.acmicpc.net/problem/11652
문제를 풀기 위해서 collections 모듈의 Counter 클래스를 생각했다. 딕셔너리 형태로 반환받은 다음에 정렬을 시키려다가 더 간단해 보이는 방법으로 풀기로 했다.
문제를 푼 방식은 간단하다. 리스트로 하기에는 너무 클 것 같아서 딕셔너리를 통해 구현했는데, 호출된 횟수만큼 저장하고 있다가 그 중에 최댓값을 구하는 것이다. 여기서 나는 직접 테이블에 추가하면서 최대 호출 횟수 중에 최소인 값인지 항상 점검하면서 유지했다. 하지만 다른 분들의 코드를 보면 딕셔너리채로 for문을 한 번 더 돌리던가 lambda를 이용한 sort를 통해 문제를 해결한 코드도 많았다.
그리고 한 가지 더 많이 있던 코드는 처음 생각했던 collections 모듈의 Counter 메소드이다. 이 Counter 클래스에 대해 더 찾다가 most_common()이라는 Counter 객체의 함수를 알게 되었다. 그래서 아래에 Counter 클래스를 이용한 풀이도 추가했다.
처음에 collections를 이용하지 않은 코드다.
import sys
N = int(sys.stdin.readline())
maxV = -(2**62) - 1
table = {maxV:0}
for _ in range(N):
key = table.keys()
data = int(sys.stdin.readline())
if data in key:
table[data] += 1
else:
table[data] = 1
if table[data] > table[maxV] or (table[data] == table[maxV] and data < maxV):
maxV = data
sys.stdout.write(str(maxV))
Counter 클래스를 이용한 코드다. #1의 방법과 #2의 방법이 존재한다. #1은 most_common() 메서드를 이용한 방식이고, #2는 items()를 통해 Counter의 딕셔너리 형태의 객체를 튜플 쌍으로 리스트에 담은 형태로 반환받아 정렬시킨 방법이다.
import sys
from collections import Counter
N = int(sys.stdin.readline())
cards = [int(sys.stdin.readline()) for _ in range(N)]
#1
# count = Counter(sorted(cards))
# print(count.most_common(1)[0][0])
#2
#count = Counter(cards)
#print(sorted(count.items(), key = lambda x: (-x[1], x[0]))[0][0])
Counter 클래스의 most_common 메서드는 아래와 같이 사용이 가능하다.
>>> from collections import Counter
>>> name = "hello world! hi my name is suri."
>>> cnt = Counter(name)
>>> print(cnt)
Counter({' ': 6, 'l': 3, 'i': 3, 'h': 2, 'e': 2, 'o': 2, 'r': 2, 'm': 2, 's': 2, 'w': 1, 'd': 1, '!': 1, 'y': 1, 'n': 1, 'a': 1, 'u': 1, '.': 1})
>>> print(cnt.most_common())
[(' ', 6), ('l', 3), ('i', 3), ('h', 2), ('e', 2), ('o', 2), ('r', 2), ('m', 2), ('s', 2), ('w', 1), ('d', 1), ('!', 1), ('y', 1), ('n', 1), ('a', 1), ('u', 1), ('.', 1)]
>>> print(cnt.most_common(1))
[(' ', 6)]
>>> print(cnt.most_common(3))
items 메서드는 다음과 같이 출력되는 것을 확인할 수 있다.
>>> from collections import Counter
>>> name = "hello world"
>>> cnt = Counter(name)
>>> cnt
Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1})
>>> cnt.items()
dict_items([('h', 1), ('e', 1), ('l', 3), ('o', 2), (' ', 1), ('w', 1), ('r', 1), ('d', 1)])
>>> list(cnt.items())
[('h', 1), ('e', 1), ('l', 3), ('o', 2), (' ', 1), ('w', 1), ('r', 1), ('d', 1)]
>>>
>>>
>>> sorted(cnt.items())
[(' ', 1), ('d', 1), ('e', 1), ('h', 1), ('l', 3), ('o', 2), ('r', 1), ('w', 1)]
>>> sorted(cnt.items(), key = lambda x:x[1])
[('h', 1), ('e', 1), (' ', 1), ('w', 1), ('r', 1), ('d', 1), ('o', 2), ('l', 3)]
>>> sorted(cnt.items(), key = lambda x:-x[1])
[('l', 3), ('o', 2), ('h', 1), ('e', 1), (' ', 1), ('w', 1), ('r', 1), ('d', 1)]
잘못된 점이나 부족한 점 지적해주시면 감사하겠습니다
'algorithm > 백준알고리즘' 카테고리의 다른 글
[백준알고리즘] 1406번: 에디터 -Python (0) | 2020.02.16 |
---|---|
[백준알고리즘] 10820번: 문자열 분석 -Python (0) | 2020.02.16 |
[백준알고리즘] 10825번: 국영수 -Python (0) | 2020.02.16 |
[백준알고리즘] 11650, 11651번: 좌표 정렬하기, 좌표 정렬하기 2 -Python (0) | 2020.02.13 |
[백준알고리즘] 11052번: 카드 구매하기 -Python (0) | 2020.02.13 |