[Python] 백준 #10815- 숫자 카드

2023. 9. 11. 18:51·코딩테스트/백준[Python]

문제


 

 

10815번: 숫자 카드

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

www.acmicpc.net

코드


My answer(시간초과)

import sys
input=sys.stdin.readline

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

for i in array:
    if(i in card):print(1,end=" ")
    else:print(0,end=" ")

My answer

import sys

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

def binary_search(target,start,end):
    if(start>end):
        return 0
    mid=(start+end)//2
    if(card[mid]==target):
        return 1
    elif(card[mid]<target):
        return binary_search(target,mid+1,end)
    elif(card[mid]>target):
        return binary_search(target,start,mid-1)
    
for i in array:
    answer=binary_search(i,0,len(card)-1)
    print(answer,end=' ')

Another answer

import sys

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

_dict = {}  # 속도는 dictionary!
for i in range(len(card)):
    _dict[card[i]] = 0  # 아무 숫자로 mapping

for j in range(m):
    if array[j] not in _dict:
        print(0, end=' ')
    else:
        print(1, end=' ')
import sys

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

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

풀이


우선 이 문제의 경우에도 여러가지 풀이 방법이 있었다.

첫번째 방법은 단순하게 파이썬의 내장함수 in을 이용하는 것이었는데, 내 카드를 순회하며 in을 통해 있는지 없는지만 확인하면 됐다. in의 경우에는 시간복잡도가 리스트에서는 O(N)이고, 집합이나 딕셔너리에선 O(1)~O(N)이다. 그러나 내 카드들 모두 확인해야하기 때문에 O(N^2)이 된다. 따라서 이 문제는 in을 사용하라는 문제가 아니었다.

두번째 방법은 이분탐색을 이용하는 것이었다. 이분탐색은 모든 숫자를 순회하지않기에 O(logN)이다.

따라서 우선 card리스트를 정렬하고 일반적인 이분탐색을 실시하면된다. 나는 재귀를 이용해서 구현했고 another answer 두번째에 반복문으로 구현한 이분탐색도 적어놨다.

마지막 방법은 해쉬탐색을 이용한 딕셔너리 방법이다. 이것도 그냥 카드들을 먼저 딕셔너리에 넣고 내 카드가 딕셔너리에 있는지만 확인하면 되는데 리스트처럼 앞에서부터 찾는게 아니라 키값을 통해서 찾는 것으로 속도가 빠르다.

728x90

'코딩테스트 > 백준[Python]' 카테고리의 다른 글

[Python] 백준 #19637 - IF문 좀 대신 써줘  (1) 2023.09.12
[Python] 백준 #2417- 정수 제곱급  (0) 2023.09.11
[Python] 백준 #1789- 수들의 합  (0) 2023.09.11
[Python] 백준 #12851- 숨바꼭질 2  (0) 2023.09.11
[Python] 백준 #1697- 숨바꼭질  (3) 2023.09.08
'코딩테스트/백준[Python]' 카테고리의 다른 글
  • [Python] 백준 #19637 - IF문 좀 대신 써줘
  • [Python] 백준 #2417- 정수 제곱급
  • [Python] 백준 #1789- 수들의 합
  • [Python] 백준 #12851- 숨바꼭질 2
창빵맨
창빵맨
  • 창빵맨
    Let's be Developers
    창빵맨
    로그인/로그아웃
  • 전체
    오늘
    어제
    • 분류 전체보기 (471)
      • 알쓸신잡 (79)
      • ML & DL (85)
        • Computer v.. (22)
        • NLP (22)
        • 파이썬 머신러닝 완.. (3)
        • 개념정리 (38)
      • 리눅스 (21)
      • 프로젝트 (29)
        • 산불 발생 예측 (6)
        • 음성비서 (12)
        • pdf 병합 프로그.. (0)
        • 수위 예측 (5)
        • 가짜 뉴스 분류 (5)
        • 전력사용량 예측 (1)
      • 코딩테스트 (217)
        • 프로그래머스[Pyt.. (17)
        • 프로그래머스[Fai.. (3)
        • 백준[Python] (160)
        • 이것이취업을위한코딩.. (18)
        • 파이썬 알고리즘 (19)
      • 데이터분석실습 (25)
        • 데이터 과학 기반의.. (18)
        • 헬로 데이터 과학 (7)
      • 메모장 (0)
      • 잡담 (4)
  • Personal

    GITHUB
    Instagram
  • 공지사항

  • 인기 글

  • 태그

    이분탐색
    이것이취업을위한코딩테스트다
    파이썬
    나동빈
    백준
    dp
    이코테
    그리디
    DFS
    BFS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3

HOME

HOME

상단으로

티스토리툴바