문제
숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 몇 개 가지고 있는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다.
셋째 줄에는 M(1 ≤ M ≤ 500,000)이 주어진다. 넷째 줄에는 상근이가 몇 개 가지고 있는 숫자 카드인지 구해야 할 M개의 정수가 주어지며, 이 수는 공백으로 구분되어져 있다. 이 수도 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다.
출력
첫째 줄에 입력으로 주어진 M개의 수에 대해서, 각 수가 적힌 숫자 카드를 상근이가 몇 개 가지고 있는지를 공백으로 구분해 출력한다.
풀이 과정1 -> 결과: 시간초과
import sys
a = sys.stdin.readline()
alis = set(map(int, sys.stdin.readline().split()))
b = sys.stdin.readline()
blis = list(map(int, sys.stdin.readline().split()))
for x in blis:
cnt = 0
for y in alis:
if x == y:
cnt+=1
print(cnt, end=' ')
[문제점]
각 x에 대해 alis의 모든 원소를 반복하면서 와 같은지 비교하는 과정은 불필요한 반복
최종 풀이 결과
import sys
from collections import Counter
a = sys.stdin.readline()
alis = list(map(int, sys.stdin.readline().split()))
b = sys.stdin.readline()
blis = list(map(int, sys.stdin.readline().split()))
counter = Counter(alis) # alis에 각 숫자가 몇 개 있는지 세기
# 각 x에 대해 counter에서 빈도수를 가져와 출력
result = [str(counter[x]) for x in blis]
sys.stdout.write(' '.join(result))
[문제 해결방법: Counter 사용]
-> Counter(alis)는 alis 리스트에 있는 각 숫자의 등장 횟수를 딕셔너리 형태로 저장
-> x에 대해 counter[x]를 가져와 리스트 result에 문자열로 저장한 후, join을 사용하여 한 번에 출력
-> 각 숫자에 대해 O(1)의 접근이 가능하므로 전체 시간 복잡도는 O(N+M)로 개선
'공부 > Python' 카테고리의 다른 글
[그리디] 백준 1931번 회의실 배정 (0) | 2025.03.27 |
---|---|
[이분탐색] 백준 2805번 나무 자르기 (0) | 2025.03.27 |
[Python] 컴프리헨션(comprehension) (0) | 2024.05.10 |
[Python] all() 함수 (0) | 2024.05.10 |
[Python] swap (0) | 2024.04.17 |