🧩 Programming Languages/Python CodingTest

백준 10816번(silver 4) : 숫자 카드 2 - 딕셔너리

복숭아아이스티에샷추가 2024. 1. 22. 21:00

 

 

10816번: 숫자 카드 2

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

www.acmicpc.net


 

 내가 작성한 코드 - 풀이 참고ㅠ 

import sys
input = sys.stdin.readline

n = int(input())
card = list(map(int, input().split()))
m = int(input())
check = list(map(int, input().split()))

dic = dict() # 각 숫자 카드를 몇 개 보유하는지 저장할 딕셔너리 생성

# 기본 값 1장 그런데 이미 있다면 1 더해서 보유 수를 늘리기
for i in card:
    if i in dic:
        dic[i] += 1
    else:
        dic[i] = 1

for c in check:
    if c in dic: # 갖고 있다면
        print(dic[c], end=' ') # 보유 수 출력
    else:
        print(0, end=' ')

 

먼저 내가 구현하려고 했을 때 list로 만들어둔 card 를 딕셔너리로 바꾸려고 했는데 쉽지 않아서 풀이를 참고하였다. 그런데 딕셔너리를 아예 새로 만드는 것도 방법이라는 것을 알게 되니 바로 풀었다!

 

그리고 출력하는 부분에서 많은 사람들이 한 줄로 구현하던데 부끄럽지만 이해하는데 시간이 조금 걸렸다.

 

 

 출력 코드만 수정

print(' '.join(str(dic[c]) if c in dic else '0' for c in check))

 

 

애초에

v = [1, 2, 3, 4, 5]
print(' '.join(str(i) for i in v))
# 출력 : 1 2 3 4 5

 

처음 코드 봤을 때는 왜 굳이 문자열화해서 출력해야하는지 궁금했는데 위와 같이 출력하는 방법이 따로 있었다.

그리고 else 문에서 숫자 0을 그대로 쓰니 런타임 에러가 났는데 따옴표를 이용해 문자열로 바꾸니 정답이 되었다.