본문 바로가기
🔅코딩테스트 공부🔅/❗백준

[백준] 10815번 숫자 카드(with python)

by 윤무무 2023. 2. 1.

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

 

10815번: 숫자 카드

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

www.acmicpc.net

 

1. 내가 작성한 코드
import sys

n = int(sys.stdin.readline())
s_number = sorted(list(map(int, sys.stdin.readline().split())))
m = int(sys.stdin.readline())
total_number = list(map(int, sys.stdin.readline().split()))
arr = []

for i in total_number:
  start = 0 
  end = n-1

  while start <= end:
    mid = (start+end)//2  
    result = 0
    if s_number[mid] == i:
      result = 1
      break
    elif s_number[mid] > i:
      end = mid-1
    elif s_number[mid] < i:
      start = mid+1

  if result == 1:
    arr.append(1)
  else:
    arr.append(0)

for i in arr:
  print(i, end=' ')

이진탐색을 이용하는 기본적인 문제이다.

 

물론 난 아직 이직탐색을 잘 활용하지 못해서 시간이 좀 걸렸다 ~ㅎㅎ,,,

 

내 코드는 arr와 for문을 이용해서 1,0을 출력해 줘서 그런지

 

아래의 코드가 시간과 메모리를 좀 더 아낄 수 있다.

 

2. 추가 코드
import sys

n = int(sys.stdin.readline())
s_number = sorted(list(map(int, sys.stdin.readline().split())))
m = int(sys.stdin.readline())
total_number = list(map(int, sys.stdin.readline().split()))
arr = []

for i in total_number:
  start = 0 
  end = n-1

  while start <= end:
    mid = (start+end)//2  
    result = False
    if s_number[mid] == i:
      result = True
      break
    elif s_number[mid] > i:
      end = mid-1
    elif s_number[mid] < i:
      start = mid+1

  print(1 if result else 0, end = ' ')

 

boolean 자료형을 활용하면 좀 더 효율적인 코딩을 할 수 있겠다고 느끼는 요즘,,

댓글