본문 바로가기
Algorithm/BOJ

[BOJ][#] 1920 | 수 찾기

by 밤초록 2022. 1. 24.
1920 | 수 찾기
https://www.acmicpc.net/problem/1920

 

 

 

작성 코드

 

import sys

N = int(sys.stdin.readline())
nums = list(map(int, sys.stdin.readline().split()))

M = int(sys.stdin.readline())
M_nums = list(map(int, sys.stdin.readline().split()))

for M_num in M_nums:
    if M_num in nums:
        print('1')
    else:
        print('0')

 

  • 시간 초과

 

이상 코드

 

set 사용

 

import sys

N = int(sys.stdin.readline())
nums = set(map(int, sys.stdin.readline().split()))

M = int(sys.stdin.readline())
M_nums = list(map(int, sys.stdin.readline().split()))

for M_num in M_nums:
    if M_num in nums:
        print('1')
    else:
        print('0')

 

  • list 대신 set을 사용함으로써 시간 복잡도 줄임

 

 

이분 탐색 사용

 

import sys

n = sys.stdin.readline()
N = sorted(map(int, sys.stdin.readline().split()))

m = sys.stdin.readline()
M = list(map(int, sys.stdin.readline().split()))

def binary(num, N, start, end):

    if start > end:
        return 0

    mid = (start + end) // 2

    if num == N[mid]:
        return 1
    elif num < N[mid]:
        end = mid - 1
    else:
        start = mid + 1
    
    return binary(num, N, start, end)
    
for num in M:
    start = 0
    end = len(N)-1
    answer = binary(num, N, start, end)
    print(answer)

 

 

 

학습

 

  • 집합 자료형에서 containment, 즉 요소를 찾는 것은 list와 달리 시간복잡도가 O(1) / remove, discard 연산도 마찬가지로 O(1)

 

  • 탐색과 확인이 주로 필요한 연산 -> Set이나 Dictionary
  • 순서와 index에 따른 접근이 필요 -> List

  • 이분 탐색 (binary search) -> 중간 값을 비교하여 이전 이후 탐색으로 나눔
  • 시간 복잡도 O(log n)
  • 재귀 함수말고도 반복문을 사용하는 방법 있음
반응형

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] 12871 | 무한 문자열  (0) 2022.01.27
[BOJ][#] 1002 | 터렛  (0) 2022.01.25
[BOJ] 1918 | 후위 표기식  (0) 2022.01.21
[BOJ] 2846 | 오르막길  (0) 2022.01.19
[BOJ] 1929 | 소수 구하기  (0) 2022.01.13

댓글