본문 바로가기
개발공부/문제풀기

백준 1920 - 수 찾기

by 맙소사 2022. 3. 21.

처음 별 생각없이 했다가 시간 초과와 맞딱뜨렸다

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def bk1920_find_number():
    # n
    # n 개의 정수
    # m
    # m 개의 정수
    # m리스트의 숫자가 m에 있는지 없는지 체크하면 됨
 
    n = int(input())
    n_list = list(input().split(" "))
 
    m = int(input())
    m_list = list(input().split(" "))
 
    for i in m_list:
        try :
            test = n_list.index(i)
            print(1)
        except :
            print(0)
            
bk1920_find_number()
cs

 

힝 ... 그래서 이진탐색을 사용해보기로 함.

근데 문제는 ... 이진탐색 개념으로는 알고 있는데 이거 코드로 구현하려니 갑자기 막막해짐.

근데 이진탐색이랑 이분탐색이랑 차이가 뭐임? 같은? 단어인듯 ? ?

 

이진탐색을 구현하면서 배운 것 : 가장 낮은 수와 가장 높은수를 더한 후 나누기 2를 하면 가운데 수를 구할 수 있다.

이거 진짜 중요한듯... 수학적인 부분이 전무하다시피 하니까 이런 사소한데서 정말 골치가 많음 8_8

 

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
def bk1920_find_number():
    # n / n 개의 정수
    # m / m 개의 정수
    # m 리스트의 숫자가 m에 있는지 없는지 체크하면 됨
    # 전부 탐색하면 시간이 미쳐돌아가기 때문에 이분탐색을 사용하기
 
    n = int(input())
    n_list = list(input().split(" "))
    n_list.sort()
 
    m = int(input())
    m_list = list(input().split(" "))
 
    # m 리스트 첫번째 값이 n 리스트에 있는지 확인하기
    for i in m_list:
        bottom = 0
        top = n - 1
        result = 0
        while bottom <= top :
            middle = ( top + bottom ) // 2
            if i == n_list[middle] :
                result = 1
                break
            elif i > n_list[middle] :
                # 중간값보다 한칸 오른쪽으로 이동해야 하기 때문에 플러스!
                bottom = middle + 1
            else :
                # 중간값보다 한 칸 왼쪽으로 이동해야 하기 때문에 마이너스!
                top = middle - 1
        print(result)
 
bk1920_find_number()
cs

 

어쨌든 해냈다. . . 이진탐색 할 때 이미지로 상상하는게 좋은 것 같아.

 

 

'개발공부 > 문제풀기' 카테고리의 다른 글

백준 10828 - 스택  (0) 2022.03.26
백준 4153 - 직각삼각형  (0) 2022.03.21
백준 2525 - 오븐시계  (0) 2022.03.20
백준 2231 - 분해합  (0) 2022.03.17
백준 1259 - 팰린드롬수  (0) 2022.03.17

댓글