새소식

Computer Science/코딩테스트 문제 풀이

[백준] 10815번: 숫자 카드

  • -

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문 도냐 둘중 하나

최대한 적게 실행되게 고민을 해야한다

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.