티스토리 뷰

알고리즘

백준 10815 - 파이썬

취뽀가자!! 2024. 2. 18. 16:31

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

 

10815번: 숫자 카드

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

www.acmicpc.net

문제 풀이

이번 문제는 서로 비교하여 카드가 존재하는지만 확인하면 되는 문제이기 때문에 금방 구현 과정으로 옮겼다. 다만 어떤 알고리즘을 활용하여 탐색을 할까 하다가 일단은 이중반복문을 사용하여 탐색을 하였다.

 

import sys
input = sys.stdin.readline

n = int(input())
myCard = list(map(int,input().split()))

m = int(input())
card = list(map(int,input().split()))

result = [0] * m
for i in range(m):
    cnt = 0
    for j in range(n):
        if myCard[j] == card[i]:
            cnt += 1
    result[i] = cnt
            

for num in result:
    print(num, end=" ")

 

하지만 이 코드는 시간 초과가 났다. 그래서 다른 방법을 찾아봤는데 이진탐색을 활용했다.

 

import sys

n = int(sys.stdin.readline())
cards = sorted(list(map(int, sys.stdin.readline().split())))
m = int(sys.stdin.readline())
checks = list(map(int, sys.stdin.readline().split()))

for check in checks:
    low, high = 0, n-1 
    exist = False
    while low <= high:
        mid = (low + high) // 2
        if cards[mid] > check:
            high = mid - 1 
        elif cards[mid] < check:  
            low = mid + 1 
        else:
            exist = True
            break
    print(1 if exist else 0, end=' ')

 

이진 탐색의 경우 시간복잡도가 O(logN)이기 때문에 무난하게 통과됐다. 다음 코드는 딕셔너리를 활용한 코드이다. 

 

import sys
from collections import deque
input = sys.stdin.readline

n = int(input())
cards = list(map(int,input().split()))
m = int(input())
checks = list(map(int,input().split()))

cardDict = {}
for i in range(n):
    cardDict[cards[i]] = 0

for i in range(m):
    if checks[i] in cardDict:
        print(1, end=" ")
    else:
        print(0, end=" ")

 

딕셔너리를 활용하여 푸는 문제는 구글링을 통해 다른 사람들의 풀이를 참고했다. 이 코드를 보다 보면 굳이 딕셔너리를 사용하지 않아도 될 듯하다. 그래서 딕셔너리를 제거하고 제출을 해 봤는데 시간 초과가 났다. 딕셔너리와 리스트의 시간 복잡도가 차이가 있나 싶어 구글링을 해 보니 차이가 있었다.

 

리스트

출처: https://ok-lab.tistory.com/232

 

딕셔너리

출처: https://ok-lab.tistory.com/232

리스트의 경우 어떤 연산인지에 따라 시간복잡도가 달라지지만, 딕셔너리의 경우 내부적으로 해시테이블로 구현이 되어 있기 때문에 모든 연산에서 시간 복잡도가 O(1)이다. 이런 차이 때문에 연산 속도에서 차이가 났던 것이다.

 

느낀점

이번 문제에서는 코드를 작성하는 거 외에도 리스트와 딕셔너리의 시간복잡도 차이를 알 수 있었던 문제였다. 또한 이진탐색도 오랜만에 사용하여 가물가물했는데 다시 한번 기억을 상기시킬 수 있었던 문제였다.

'알고리즘' 카테고리의 다른 글

백준 1620 - 파이썬  (1) 2024.02.20
백준 18870 - 파이썬  (0) 2024.02.16
백준 1789 - 파이썬  (0) 2024.02.05
백준 2839 - 파이썬  (2) 2024.01.25
백준 1436 - 파이썬  (0) 2024.01.19
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함