백준

[파이썬]-백준(BOJ) 10815번_ 숫자카드

Ho's log 2021. 5. 3. 17:39

www.acmicpc.net/problem/10815

 

10815번: 숫자 카드

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,

www.acmicpc.net

해설

이분 탐색으로 풀어야 합니다!!

선형 탐색으로 접근해서 시간 초과가 난후, index 함수로 인한 시간초과후 이분탐색으로 풀었습니다. 

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# https://www.acmicpc.net/problem/10815
# 숫자 카드
 
# index 함수 쓰면 시간 초과 순차 탐색이라 그런거 같다
def solution(nl, ml):
    # 정답 배열
    answer = [0* (len(ml))
 
    # 배열 정렬
    nl.sort()
 
    # 원소를 돌면서
    for element in range(len(ml)):
        left = 0
        right = len(nl)-1
 
        #왼쪽이 더 작을때만 반복을 하는데
        while left <= right:
            # 중앙값은 왼쪽 오른쪽 더해서 나누고
            mid = (left + right) // 2
 
            # 만약 그값과 일치한다면
            if nl[mid] == ml[element]:
                # 인덱스를 조정해주고
                answer[element] = 1
                # 탈출
                break
 
            # 중압값 보다 크면 오른쪽 작게
            elif nl[mid] > ml[element]:
                right = mid - 1
            # 왼쪽 더해주기
            else:
                left = mid + 1
 
 
    # # 원소를 돌면서
    # for element in ml:
    #
    #     a = 0
    #     b = len(nl) // 2 - 1
    #     # 엘리 먼트가 중앙 값보다 작으면
    #     if element < nl[len(nl) // 2]:
    #         # 앞쪽만 돈다
    #         for i in range(a, len(nl) // 2):
    #             if nl[i] == element:
    #                 answer[ml.index(element)] = 1
    #                 a = i
    #                 break
    #     else:
    #         for i in range(b, len(nl)):
    #             if nl[i] == element:
    #                 answer[ml.index(element)] = 1
    #                 b = i
    #                 break
 
    return answer
 
 
if __name__ == '__main__':
    N = 5
    Nl = [63210- 10]
    M = 8
    Ml = [109- 52345- 10]
 
    N = input()
    Nl = list(map(int, input().split()))
    M = input()
    Ml = list(map(int, input().split()))
 
    print(*solution(Nl, Ml))
 
cs