코딩테스트 : 10815 숫자카드

juhee·2025년 7월 23일

코딩테스트

목록 보기
15/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을 공백으로 구분해 출력한다.

제한사항

  • 시간 제한: 2초
  • 메모리 제한: 256MB

입출력 예

예제 입력 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

문제 유형 분류

  • 자료구조
  • 탐색 (Search)
  • 해시셋 / 이진 탐색

시간 복잡도 + 공간복잡도 추정

  • N, M ≤ 500,000 → O(N x M) 불가능
  • 효율적인 탐색 필요

해시셋(set) 사용 시

  • 입력 저장: O(N)
  • 탐색 M번: O(1) 평균 → 총 O(N + M)
  • 공간복잡도: O(N) (카드 저장용)

이진 탐색 사용 시 (정렬 필요)

  • 정렬: O(N log N)
  • 탐색 M번: O(M log N)

총 O(N log N + M log N)

둘 다 충분히 시간 내 가능 (2초 제한)

적합한 알고리즘 / 자료구조

  • 해시셋 (set) 또는 이진 탐색 (Binary Search) → 둘 중 set이 가장 간단하고 빠름 (문제에서 중복 없는 카드라고 했기 때문에 set에 적합)

필요한 라이브러리

  • sys.stdin.readline (입력 빠르게 받기 위해)
  • 또는 bisect (이진 탐색 방식 선택 시)

최악의 경우 시뮬레이션

  • N = M = 500,000일 때
    • set 사용 시: 약 100만 연산 (충분히 처리 가능)
    • list + in: O(N x M) → 시간 초과 발생

접근 방법

  1. 숫자 카드를 set에 저장
  2. M개의 숫자 각각에 대해 in 연산
  3. 결과를 리스트로 저장하고 출력

최종 코드

import sys

# 입력 빠르게
input = sys.stdin.readline

# 입력 처리
N = int(input())
cards = set(map(int, input().split()))
M = int(input())
queries = list(map(int, input().split()))

# 탐색
result = []
for num in queries:
    if num in cards:
        result.append('1')
    else:
        result.append('0')

# 출력
print(' '.join(result))

추가 팁 / 주의사항 / 많이 실수하는 점

  • input() 대신 sys.stdin.readline() 사용해야 시간 초과 방지 가능
  • 출력은 join으로 처리해야 시간 절약됨 (print(…, end=’ ‘)보다 빠름)
  • list로 탐색하면 시간 초과 (in이 O(N)임)
  • Python3는 set 탐색이 평균 O(1)이라 매우 적합

0개의 댓글