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

문제 이해
카드의 개수를 세고 가장 많은 카드의 개수의 정수를 출력하는 문제이다.
"가장 많은 카드의 개수의 정수가 여러가지이면, 숫자가 작은 것을 출력한다"라는 것이 조건에 있다.
문제 풀이(시간 초과)
# 시간 초과
n = int(input())
li = []
ans = []
for _ in range(n):
card = int(input())
li.append(card)
li.sort()
card_set = list(set(li))
card_set.sort()
cnt = []
for c in card_set:
cnt.append(li.count(c)) # 시간초과 원인
for i,v in enumerate(cnt):
if max(cnt) == v:
ans.append(card_set[i])
print(min(ans))
내가 나름 풀어 본 코드이다.
count() 함수로 인해 시간초과가 발생했다.
count()를 사용하면 리스트를 여러번 순회하기 때문에 시간초과가 발생하는 것이다.
이 문제의 해결 방법은 Counter() 이였다!!
문제 풀이(정답 : Counter())
# 정답 : Counter() 사용
n = int(input())
card = [int(input()) for _ in range(n)]
ans = []
from collections import Counter
cnt = Counter(card).most_common() # 데이터 개수 많은 순대로
max_cnt = cnt[0][1]
for i in cnt:
if i[1] == max_cnt:
ans.append(i[0])
ans.sort()
print(ans[0])
count()의 시간 초과 문제를 해결하기 위해 Counter() 함수를 사용했다.
그리고 입력값도 리스트 컨프리헨션으로 좀 더 깔끔하게 코드를 작성했다.
count() vs Counter()
count()는 내장함수이고 Counter()는 외장함수이다.
from collections import Counter
count()는 set자료형에서는 사용이 불가하고 딕셔너리 형태로 사용하면 좋다.
Counter()를 사용하면 더 쉽게 딕셔너리 형태로 사용 가능하다.
그리고 가장 중요한 점인 Counter()는 순회하지 않고 한 번에 모든 개수를 구할 수 있어서 시간 효율성이 굉장히 좋다.
Counter()의 특징
- Counter 생성자에 문자열을 인자로 넘기면 각 문자가 문자열에서 몇 번씩 나타나는지를 알려주는 객체가 반환됩니다.
- most_common() : 데이터 개수 많은 순대로 출력한다.
'알고리즘문제풀이' 카테고리의 다른 글
| [백준/Python] 11729번 2×n 타일링 (0) | 2025.03.05 |
|---|---|
| [백준/Python] 28278번 스택 2 (0) | 2025.03.04 |
| [백준/Python] 7785번 회사에 있는 사람 (0) | 2025.02.27 |
| [백준/Python] 2563번 색종이 (0) | 2025.02.26 |
| [백준/Python] 2606번 바이러스 (0) | 2025.02.25 |
