저장된 데이터들 중에서 원하는 값을 찾는 문제
시간 복잡도
길이 n짜리의 리스트 탐색할 경우
최선: 리스트의 첫 번째 원소가 정답인 경우: 1번
최악: 리스트의 맨 마지막 원소가 정답이거나, 정답이 없을 경우: n번
따라서 O(n) 의 시간복잡도를 가진다
시간 복잡도
최선: 리스트의 중간부분이 정답일 때: 1번
최악: 리스트에 정답이 없는 경우: log2(n)번
따라서 O(logn) 의 시간 복잡도를 가짐
선형 탐색은 n이 증가함에 따라 시간 복잡도가 선형적으로 증가하지만, 이진탐색은 n이 증가해도 시간 복잡도가 아주 천천히 증가한다. 정렬된 리스트에는 이진 탐색 적용.

문제 분석
입력
출력
제한 사항
풀이
from itertools import permutations
def solution(k, dungeons):
answer = []
for i in permutations(dungeons, len(dungeons)):
count = 0
c = k
cnt = 0
for a, b in i:
if c >= a:
c -= b
cnt += 1
answer.append(cnt)
return max(answer)
문제 분석
입력
출력
제한 사항
풀이
시간 초과 풀이
#차집합
a, b = map(int, input().split())
A = list(map(int, input().split()))
B = list(map(int, input().split()))
answer = []
for i in A:
if i in B:
pass
else:
answer.append(i)
print(len(answer))
print(' '.join(map(str, answer)))
통과된 풀이
a, b = map(int, input().split())
A = set(map(int, input().split()))
B = set(map(int, input().split()))
answer = A - B
answer = list(answer)
answer.sort()
print(len(answer))
print(' '.join(map(str, answer)))
문제 분석
입력
출력
제한 사항
풀이
정렬되어 주어진 입력값을 보고 이진 탐색 문제임을 알아냈다.
처음에 비교할 최소값을 0으로 둬서 틀렸다 ~~0에 가까운 값 찾는 건데 자꾸 최소값으로 헷갈린다 ~~
그 다음 틀린 풀이
N = int(input())
A = list(map(int, input().split()))
m = A[0] + A[1]
for i in range(N):
high = N-1
low = i
while high >= low:
mid = (high + low) // 2
a = A[i] + A[mid]
if a < 0:
low = mid + 1
elif a > 0:
high = mid - 1
else:
a = 0
break
if abs(a) < abs(m):
m = a
print(m)

그래서 길이가 2인 경우만 처리를 해주었당
근데 이번에 제출하니 틀렸댄다 모지!!!!
N = int(input())
A = list(map(int, input().split()))
m = A[0] + A[1]
for i in range(N):
high = N-1
low = i
while high >= low:
if N == 2:
a = A[0] + A[1]
break
else:
mid = (high + low) // 2
a = A[i] + A[mid]
if a < 0:
low = mid + 1
elif a > 0:
high = mid - 1
else:
a = 0
break
if abs(a) < abs(m):
m = a
print(m)
N = int(input())
A = list(map(int, input().split()))
m = A[0] + A[1]
for i in range(N-1):
high = N-1
low = i + 1
while high >= low:
if N == 2:
a = A[0] + A[1]
break
else:
mid = (high + low) // 2
a = A[i] + A[mid]
if a == 0:
m = a
break
else:
if a < 0:
low = mid + 1
elif a > 0:
high = mid - 1
else:
a = 0
break
if abs(a) < abs(m):
m = a
print(m)
주석 달고 수정한 최종 코드
N = int(input())
A = list(map(int, input().split()))
m = A[0] + A[1] # 초기 용액 값 설정
for i in range(N-1):
high = N-1
low = i + 1 # 자기 자신 제외
while high >= low: # 이분 탐색 시작
mid = (high + low) // 2
a = A[i] + A[mid] # 기준 용액 + 중간 용액 값
if a == 0: # 0이면 종료
m = a
break
else:
if a < 0: # 0보다 작으면 오른쪽으로
low = mid + 1
elif a > 0: # 0보다 크면 왼쪽으로
high = mid - 1
else:
a = 0 # 값이 0이면 종료
break
if abs(a) < abs(m): # 0과 가까운지 비교하여 값 업데이트
m = a
print(m)