본문 바로가기

algorithm/백준알고리즘

[백준알고리즘] 11652번: 카드 -Python

728x90

[백준알고리즘] 11652번: 카드 -Python

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

 

11652번: 카드

준규는 숫자 카드 N장을 가지고 있다. 숫자 카드에는 정수가 하나 적혀있는데, 적혀있는 수는 -262보다 크거나 같고, 262보다 작거나 같다. 준규가 가지고 있는 카드가 주어졌을 때, 가장 많이 가지고 있는 정수를 구하는 프로그램을 작성하시오. 만약, 가장 많이 가지고 있는 정수가 여러 가지라면, 작은 것을 출력한다.

www.acmicpc.net

문제를 풀기 위해서  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)]

 

잘못된 점이나 부족한 점 지적해주시면 감사하겠습니다

728x90