https://www.acmicpc.net/problem/10815
[백준] 10815번. 숫자 카드
https://www.acmicpc.net/problem/10815
숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 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을 공백으로 구분해 출력한다.
예제
5
6 3 2 10 -10
8
10 9 -5 2 3 4 5 -10
출력
1 0 0 1 1 0 0 1
방법1:
import sys
# sys.stdin=open('input.txt', 'r')
input = sys.stdin.readline
if __name__=="__main__":
N = int(input())
cards = set(map(int, input().split()))
M = int(input())
checks = list(map(int, input().split()))
result = [1 if check in cards else 0 for check in checks]
print(*result)
list의 요소를 for문을 돌면서 다른 list에 같은 요소가 있는지 확인하려면 in을 쓸때 하나하나 다 확인하는데
set을 쓸 경우 in을 쓰면 중복도 제거하고 한번에 확인을 한다고 한다.
그러니깐 check할 카드들 checks의 요소를 하나씩 뽑으면서 cards라는 set에 요소가 있는지 확인한다.
방법2:
import sys
# sys.stdin=open('input.txt', 'r')
input = sys.stdin.readline
if __name__=="__main__":
N = int(input())
cards = list(map(int, input().split()))
M = int(input())
checks = list(map(int, input().split()))
nums = [0]*len(checks)
answer = dict(zip(checks, nums))
# {10: 0, 9: 0, -5: 0, 2: 0, 3: 0, 4: 0, 5: 0, -10: 0}
for card in cards:
if card in answer.keys(): # 여기서 answer.keys() 대신 check하면 시간초과
answer[card] = 1
print(*answer.values())
checks 체크할 카드별 cards의 카드가 있는지(1) 없는지(0)를 표시할 딕셔너리를 만들고 cards를 for문을 돌면서 answer라는 딕셔너리에 표기한다.
결론
즉, 두 리스트 중 cards를 for문 도냐, checks를 for문 도냐 둘중 하나
최대한 적게 실행되게 고민을 해야한다