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개의 수에 대해서, 각 수가 적힌 숫자 카드를 상근이가 몇 개 가지고 있는지를 공백으로 구분해 출력한다.

i = input; _ = i()
num_set = {}
for n in i().split():
    if n in num_set: num_set[n] += 1
    else: num_set[n] = 1
_ = input()
print(' '.join([str(num_set[i]) if i in num_set else '0' for i in i().split()]))

풀이 : N개의 카드를 입력받은 뒤 split을 이용하여 list 형태로 만들어 준뒤 for 문에 사용한다. 순서대로 넘어가면서 key값은 입력받은 숫자(n)으로, value값은 해당 숫자의 개수를 가지는 num_set 딕셔너리를 만들어준다. 그 뒤 M개의 숫자에 대해서 차례대로 살펴보며 num_set내에 존재한다면 value인 개수를, 존재하지 않는다면 0을 출력해준다.

 

추가.

_ = int(input())
num = input().split()
num_set = {n:str(num.count(n)) for n in set(num)}
_ = input()
print(' '.join([num_set[i] if i in num_set else '0' for i in input().split()]))

위와 같이 조금더 간결하게 count 함수를 사용하여 코드를 작성할 경우 시간초과가 뜨게된다. 아마도 count함수가 작동되면서 하나의 숫자에 대해서 리스트 전체를 살펴보는 작업을 여러번 반복하려다 보니깐 시간초과가 뜨는게 아닐까라고 예상한다. 성공한 코드의 경우에는 리스트를 전체적으로 한번만 돌려보면 개수에 대한 정보가 담긴 딕셔너리가 완성되지만, 시간초과 코드의 경우 모든 경우에 대해서 리스트 전체를 살펴보는 작업을 해야하기 때문에 소요시간이 늘어나고 시간초과가 뜨는 것이라고 생각한다.

+ Recent posts