공부/Python

[이분탐색] 백준 10816번 숫자 카드 2

순제로 2025. 3. 27. 12:55
728x90
반응형

문제

숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 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)로 개선

728x90
반응형

'공부 > 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