728x90
SMALL
문제
https://www.acmicpc.net/problem/10816
10816번: 숫자 카드 2
첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,0
www.acmicpc.net
풀이
딕셔너리를 사용하여 카드의 등장 횟수를 미리 계산하고, 그 값을 조회하는 방법을 사용했다. 카드 리스트를 한 번만 반복한다.
from collections import Counter
N = int(input())
card = list(map(int, input().split()))
M = int(input())
target_card = list(map(int, input().split()))
card_count = Counter(card)# 카드의 등장 횟수를 계산하여 딕셔너리로 저장
for num in target_card: # 타겟 카드의 등장 횟수를 조회하여 출력
print(card_count[num], end=' ')
Counter 클래스는 collections 모듈에 있는 클래스로, 리스트나 이터러블 객체의 각 요소의 등장 횟수를 센다.
## Counter사용예시
from collections import Counter
# 카드 리스트가 주어진 경우
card = [1, 2, 3, 1, 2, 1, 3, 2, 1, 3]
# Counter를 사용하여 등장 횟수를 계산하고 딕셔너리로 저장
card_count = Counter(card)
print(card_count)
# 출력: Counter({1: 4, 2: 3, 3: 3})
-> Counter을 사용하여 딕셔너리 형태로 각 요소가 몇 번 등장했는지를 저장
target_card 리스트에 있는 각 숫자를 조회하여 card_count 딕셔너리에서 해당 숫자의 등장 횟수를 찾아 출력한다.
덧)
처음에 리스트의 count() 메서드를 사용하여 각 타겟 카드의 등장 횟수를 계산하였으나 시간초과가 떴다.
count()메서드는 매번 전체 리스트를 선형 탐색해야 하므로 시간이 오래 걸릴 수 있다고 한다.
N=int(input())
card=[int(x) for x in input().split(' ')]
M=int(input())
target_card=[int(x) for x in input().split(' ')]
for i in target_card:
print(card.count((i)),end=' ')
728x90
LIST
'코테공부 > python 백준' 카테고리의 다른 글
파이썬 백준 11650 : 좌표 정렬하기 (0) | 2024.03.18 |
---|---|
파이썬 백준 11399 : ATM (0) | 2024.03.18 |
백준 1920 : 수 찾기 (0) | 2024.03.15 |
파이썬 백준 1764 : 듣보잡 (0) | 2024.03.15 |
파이썬 백준 1427 : 소트인사이드 (0) | 2024.03.14 |