본문 바로가기
알고리즘

[BAEKJOON] 10815 숫자 카드

by mAlfred 2024. 2. 15.
반응형

문제

숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 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개의 수에 대해서, 각 수가 적힌 숫자 카드를 상근이가 가지고 있으면 1을, 아니면 0을 공백으로 구분해 출력한다.

예제 입력 1 복사

5
6 3 2 10 -10
8
10 9 -5 2 3 4 5 -10

예제 출력 1 복사

1 0 0 1 1 0 0 1

이 문제는 2번째 줄에 입력된 값들이 4번째 입력된 값과 비교를 하여 유무를 파악하여 4번째 입력된 값이 2번째 값에 존재한다면 1 없으면 0을 출력 해주면 된다

그런데 문제는 4번째 줄에 입력된 값을 2번째 줄에 입력된 값들을 모두 비교를 하면 n^n? n^m? 암튼 기하급수적으로 늘어난다.

그렇기 때문에 이 문제를 접근할 때에 딕셔너리를 통해 접근하면 반복은 m번만 돌면 되기 때문에 풀릴 수 있을 것 같았음.

 

그런데 코드를 좀더 깔끔하게 작성하고 싶었다.

for문을 통해 dict를 만드는 것이 아닌 한 줄로 만들고 싶은 그런 낭만이 생겨버린 것.

 

그래서 검색을 하다 zip을 통해 list를 dict로 변경할 수 있는 것을 발견

 

list1 = ['aaa','bbb','ccc','ddd']
list2 = [11,22,33,44]

dict_list= dict(zip(list1,list2))

print(dict_list)

 

하지만 여기 문제에서는 value 값을 가질 필요가 없기 때문에 더미 데이터를 넣어주면 될듯 싶었다.

 

그래서 range를 통해 더미 데이터 생성 후 넣어주었다.

 

import sys

n = int(sys.stdin.readline().strip())
ns = list(map(int, sys.stdin.readline().strip().split()))
nd = dict(zip(ns, range(len(ns))))
m = int(sys.stdin.readline().strip())
ms = list(map(int, sys.stdin.readline().strip().split()))

for i in ms:
    if i in nd.keys():
        print('1 ', end='')
    else:
        print('0 ', end='')

 

반응형

'알고리즘' 카테고리의 다른 글

[BAEKJOON] 28235 코드마스터 2023  (0) 2024.02.21
[BAEKJOON] 10102 개표  (0) 2024.02.21
[BAEKJOON] 10768 특별한 날  (0) 2024.02.14
[BAEKJOON] 11651 좌표 정렬하기 2  (0) 2024.02.13
[BAEKJOON] 25625 샤틀버스  (0) 2024.02.13