파이썬 알고리즘 문제 풀이

Baekjoon Online Judge 10816번 파이썬

gogi masidda 2022. 9. 26. 17:30

문제 링크
https://www.acmicpc.net/problem/10816

 

10816번: 숫자 카드 2

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,

www.acmicpc.net


10815번 문제와 유사해서 계속 이진 탐색 주변만 맴돌았다. 제대로 풀지 못했다.

정답 코드
1. Counter 이용
Counter를 이용해서 풀 수 있다. Counter는 각 원소가 몇번 나오는지 딕셔너리 형태로 반환해준다.
‘from collections import Counter’를 맨 위에 해주어야 한다.

count = Counter(nums_card)를 하면 count는 {6:1,3:2,2:1,10:3,-10:2,7:1}이 될 것이다. nums_int를 하나씩 돌아보며 count에서 하나씩 출력하면 된다.

import sys
from collections import Counter

N = int(sys.stdin.readline())
nums_card = list(map(int,sys.stdin.readline().split()))
M = int(sys.stdin.readline())
nums_int = list(map(int,sys.stdin.readline().split()))

count = Counter(nums_card)

for i in range(M):
  if nums_int[i] in count:
    print(count[nums_int[i]],end=' ')
  else:
    print(0, end=' ')


2. 파이썬 딕셔너리 이용
Counter로 푼 방식과 유사하다. Counter가 해주는 역할을 딕셔너리를 이용하여 직접 작성해주는 것이다.

import sys
from collections import Counter

N = int(sys.stdin.readline())
nums_card = list(map(int,sys.stdin.readline().split()))
M = int(sys.stdin.readline())
nums_int = list(map(int,sys.stdin.readline().split()))

dic = {}

for i in nums_card:
  if i in dic:
    dic[i] += 1
  else:
    dic[i] = 1 

for i in nums_int:
  if i in dic:
    print(dic[i], end=' ')
  else:
    print(0, end=' ')

 

728x90