4/3
4/4 해시(dict), 우선순위 큐 heap
4/5 이분 탐색, 정렬
내용 정리
이분 탐색
# 이분탐색의 중요한 점은 정렬된 배열이어야 한다는 점
def brnary_search(arr, target):
left = 0 #처음 시작할 곳은 각각 왼쪽과 오른쪽 끝
right = len(arr) - 1
while left <= right:
mid = (left + right) // 2
# 중간부터 탐색하기 위해서 양 끝을 더한 값 % 2 (몫만)
if arr[mid] == target:
print(mid)
# 맞췄다면 출력
elif arr[mid] < target:
left += mid + 1
elif arr[mid] > target:
right = mid - 1
"sort()는 반환값이 없다!"
a = [2, 3, 1, 4]
b = a.sort()
print(a) # [1, 2, 3, 4]
print(b) # None
# 내림차순
a.sort(reverse=True) # [4, 3, 2, 1]
"정렬 기준을 바꿀 수 있다. sort의 key 사용"
a = [2, -1, 4, 3]
# x의 제곱 값을 기준으로 오름차순 정렬
a.sort(key=lambda x: x*x)
print(a) # [-1, 2, 3, 4]
# key에는 어떤 값을 받아서 다른 값을 반환하는 함수를 넣음
# lambda x: x * x -> 람다 x는 x의 제곱을 하는 함수.
# lambda fun를 만들어서 key에 넣어줬다고 보면 됨
백준 1181: 단어정렬
https://www.acmicpc.net/problem/1181
# 길이가 짧은 순, 길이가 같다면 사전 순, 중복 단어 제거
# 사전에 단어의 길이를 key로 단어 추가하기
# 사전의 key 값으로 정렬하기
from collections import defaultdict
n = int(input())
len_word = defaultdict(set)
for _ in range(n):
word = input()
len_word[len(word)].add(word)
keys = list(len_word.keys())
# [3, 1, 4, 8, 2, 6, 5] -> word 글자수들
keys.sort()
# keys 값을 정렬, 그 값으로 len_word에 단어들 꺼내기
for key in keys:
words = list(len_word[key])
words.sort() # 단어 여러개, 같은 글자라면 사전순
for word in words:
print(word)
# words를 set으로 입력받기 (중복 제거)
# 정렬하려면 list로 변환
# sort()의 key에 튜플로 정렬 기준을 두개 제시
# 튜플 (1차 기준 정렬, 2차 기준 정렬)
n = int(input())
words = list({input() for _ in range(n)})
words.sort(key=lambda x: (len(x), x))
for word in words:
print(word)
이진 탐색 문제의 경우는 나무 자르기 처럼 한번 문제를 꼬아서 이진 탐색을 써야하는지 헷갈리게 나오는 것이 많음!
이진 탐색 시그널
입력을 봤을 때 범위가 크거나, 입력값이 뭐에 대해 최소값이 될 때.
입국심사의 문제도 “상근이와 친구들이 심사를 받는데 걸리는 시간의 최솟값을 구하는 프로그램을 작성하시오.” → 이진 탐색인지 의심할 수 있음
2번은 이진 탐색 문제 맛보기.
백준 2805번: 나무자르기 https://www.acmicpc.net/problem/2805
4번 6번은 어려울 수 있음
백준 3079번: 입국심사 https://www.acmicpc.net/problem/3079
백준 2110번: 공유기 설치 https://www.acmicpc.net/problem/2110
5번은 투포인터로도 풀 수 있고 자주 나오는 유형
백준 2470번: 두 용액 https://www.acmicpc.net/problem/2470
8번 잘만든 문제같음(heap 사용) https://www.acmicpc.net/problem/1202