본문 바로가기

algorithm/백준알고리즘

[백준알고리즘] 10815번: 숫자 카드 -Python

728x90

[백준알고리즘] 10815번: 숫자 카드 -Python

https://www.acmicpc.net/problem/10815

 

10815번: 숫자 카드

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이가 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다. 두 숫자 카드에 같은 수가 적혀있는 경우는 없다. 셋째 줄에는 M(1 ≤ M ≤ 500,000)이 주어진다. 넷째 줄에는 상근이가 가지고 있는 숫자 카드인지 아닌지를 구해야 할 M개의 정수가 주어지며, 이

www.acmicpc.net

처음에 주어진 수들이 존재하고, 다음에 주어지는 값들이 여기에 존재하는지 판단하는 문제이다.

 

생각나는 대로 이분 탐색을 통해서 문제를 해결했다. 해결하고 보니 다른 분들의 코드는 통과 시간이 더 짧길래 확인을 해보니 처음에 존재하는 카드들을 set()을 통해 받으신 분들이 많았다. set()으로 받고 추가로 찾는 값들에는 in을 써서 확인을 했다.

 

set()을 이용한 건 그냥 그러려니 하는데 특이한 건 딕셔너리를 이용한 방법이었다. 딕셔너리 자체가 이상한 것이 아니라 잘 안 썼기 때문에 딕셔너리에 값을 넣고 꺼내는 방식을 간단하게 표현해 인상이 깊었다. 그래서 그렇게도 한 번 따라서 해봤다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import sys
input = sys.stdin.readline
 
def find(low, high):
    if low > high:
        print("0", end=" ")
        return
 
    mid = (low + high) // 2
    if cards[mid] == c:
        print("1", end=" ")
        return
    elif cards[mid] > c:
        find(low, mid - 1)
    else# cards[mid] < c
        find(mid + 1, high)
 
= int(input())
cards = list(map(int, input().split()))
cards.sort()
= int(input())
choices = list(map(int, input().split()))
 
for c in choices:
    find(0, n-1)

 

dict 안에서 (num, 1)을 tuple 형태로 (key, value) 쌍으로써 반복해서 넣어주게 된다. 꺼낼 때에는 .get() 메서드를 사용해서 에러 발생을 예방하고, get(c, 0)으로 함수를 호출해 저장한 value들은 1밖에 없으므로 key에 c가 있으면 1을 return 해 줄 것이고, 없다면 default value로 정해준 0을 return 해줄 것이다. 

1
2
3
4
5
6
7
8
9
10
import sys
input = sys.stdin.readline
 
= input()
cards = dict((num, 1for num in list(map(int, input().split())))
= input()
choices = list(map(int, input().split()))
 
for c in choices:
    print(cards.get(c, 0), end=" ")

 

잘못된 점이나 부족한 점 지적해주시면 감사하겠습니다

728x90