코딩문제풀이/Baekjoon

[Python_Search] 백준 10816번 : 숫자 카드 2

코딩하는 포메라니안 2021. 8. 19. 21:53

1. 문제

https://www.acmicpc.net/problem/10816

 

10816번: 숫자 카드 2

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

www.acmicpc.net

 

 

 

2. 풀이 과정

 

방법 1) 다음 코드에서는 사전 자료형을 사용하였다.

- 이진탐색을 시도했으나 시간 초과로 실패하였다. 하나의 값을 찾을 땐 효율적이지만, 다수의 값을 찾고 그 값들이 중복 가능할 때는 특정 값의 개수를 저장해놓고 꺼내서 출력하는 것이 더 빠르다.

 

import sys
input = sys.stdin.readline
n = int(input())
sang = list(map(int, input().split()))
m = int(input())
find = list(map(int, input().split()))

d = dict()
for i in sang:
  try:
    d[i] += 1
  except:
    d[i] = 1

for j in find:
  try:
    print(d[j], end = " ")
  except:
    print(0, end = " ")

 

방법 2) Collections 라이브러리 사용

import sys, collections
input = sys.stdin.readline

input() #n
a = collections.Counter(input().split())
input() #m
print(*(a[v] for v in input().split()))
#print 함수에서 인자 여러 개를 받음
#print(a[0], a[1]...) 과 같은 의미

 

+a) *변수와 **변수

함수에서 여러 인자를 받을 때 사용하는 것으로 C/C++에서의 포인터와는 다른 개념이다.

 

*변수 : 튜플,로 인자들을 받을 때

def name_print(*names):
    for name in names:
        print("%s %s" %(name[0], name[1:3]), end=' ')
    print("\n")
    
name_print('김철수', '이수영')

#김 철수 이 수영

 

**변수 : 사전형으로 인자들을 받을 때

def name_print(**kwargs):
    for k, v in kwars.items():
        print("{0} is {1}".format(k, v))
        
name_print(MyName = '김철수')
name_print(FriendName = '이수영')

#MyName is 김철수
#FriendName is 이수영