분류 | 문제 | |
수학 | Mathematics | 5228 |
구현 | Implementation | 4498 |
다이나믹 프로그래밍 | Dynamic Programming | 3355 |
그래프 이론 | Graph Theory | 3079 |
자료 구조 | Data Structures | 3077 |
문자열 | String | 1981 |
그리디 알고리즘 | Greedy | 1939 |
브루트포스 알고리즘 | Bruteforcing | 1811 |
그래프 탐색 | Graph Traversal | 1708 |
정렬 | Sorting | 1479 |
기하학 | Geometry | 1206 |
정수론 | Number Theory | 1179 |
트리 | Tree | 1122 |
세그먼트 트리 | Segment Tree | 1076 |
이분 탐색 | Binary Search | 996 |
애드 혹 | Ad-hoc | 976 |
사칙연산 | Arithmetic | 880 |
시뮬레이션 | Simulation | 859 |
너비 우선 탐색 | Breadth-first Search | 850 |
해 구성하기 | Constructive | 728 |
누적 합 | Prefix Sum | 717 |
조합론 | Combinatorics | 708 |
깊이 우선 탐색 | Depth-first Search | 693 |
많은 조건 분기 | Case Work | 636 |
비트마스킹 | Bitmask | 597 |
데이크스트라 | Dijkstra's | 480 |
해시를 사용한 집합과 맵 | Set / Map By Hashing | 470 |
백트래킹 | Backtracking | 416 |
트리를 사용한 집합과 맵 | Set / Map By Trees | 389 |
스위핑 | Sweeping | 386 |
분리 집합 | Disjoint Set | 375 |
파싱 | Parsing | 373 |
분할 정복 | Divide And Conquer | 359 |
트리에서의 다이나믹 프로그래밍 | Dynamic Programming On Trees | 339 |
우선순위 큐 | Priority Queue | 336 |
스택 | Stack | 315 |
두 포인터 | Two-pointer | 304 |
게임 이론 | Game Theory | 280 |
최대 유량 | Maximum Flow | 278 |
매개 변수 탐색 | Parametric Search | 278 |
소수 판정 | Primality Test | 271 |
느리게 갱신되는 세그먼트 트리 | Segment Tree With Lazy Propagation | 250 |
비트필드를 이용한 다이나믹 프로그래밍 | Dynamic Programming Using Bitfield | 250 |
확률론 | Probability Theory | 225 |
분할 정복을 이용한 거듭제곱 | Exponentiation By Squaring | 222 |
임의 정밀도 / 큰 수 연산 | Arbitrary Precision / Big Integers | 220 |
오프라인 쿼리 | Offline Queries | 208 |
재귀 | Recursion | 189 |
배낭 문제 | Knapsack | 183 |
런타임 전의 전처리 | Precomputation | 175 |
에라토스테네스의 체 | Sieve Of Eratosthenes | 172 |
최소 스패닝 트리 | Minimum Spanning Tree | 170 |
값 / 좌표 압축 | Value / Coordinate Compression | 170 |
이분 매칭 | Bipartite Matching | 158 |
유클리드 호제법 | Euclidean Algorithm | 157 |
플로이드–워셜 | Floyd–warshall | 152 |
위상 정렬 | Topological Sorting | 151 |
최소 공통 조상 | Lowest Common Ancestor | 144 |
선형대수학 | Linear Algebra | 143 |
해싱 | Hashing | 141 |
볼록 껍질 | Convex Hull | 136 |
강한 연결 요소 | Strongly Connected Component | 129 |
포함 배제의 원리 | Inclusion And Exclusion | 127 |
무작위화 | Randomization | 121 |
희소 배열 | Sparse Table | 116 |
고속 푸리에 변환 | Fast Fourier Transform | 108 |
트라이 | Trie | 107 |
작은 집합에서 큰 집합으로 합치는 테크닉 | Smaller To Larger Technique | 95 |
최소 비용 최대 유량 | Minimum Cost Maximum Flow | 94 |
제곱근 분할법 | Square Root Decomposition | 92 |
선분 교차 판정 | Line Segment Intersection Check | 91 |
덱 | Deque | 90 |
접미사 배열과 lcp 배열 | Suffix Array And Lcp Array | 87 |
볼록 껍질을 이용한 최적화 | Convex Hull Trick | 84 |
미적분학 | Calculus | 84 |
3차원 기하학 | Geometry; 3d | 84 |
스프라그–그런디 정리 | Sprague–grundy Theorem | 80 |
휴리스틱 | Heuristics | 80 |
슬라이딩 윈도우 | Sliding Window | 78 |
오일러 경로 테크닉 | Euler Tour Technique | 77 |
중간에서 만나기 | Meet In The Middle | 76 |
센트로이드 | Centroid | 75 |
삼분 탐색 | Ternary Search | 74 |
가장 긴 증가하는 부분 수열: o(n log n) | Longest Increasing Sequence In O(n Log N) | 72 |
kmp | Knuth–morris–pratt | 71 |
피타고라스 정리 | Pythagoras Theorem | 69 |
센트로이드 분할 | Centroid Decomposition | 68 |
가우스 소거법 | Gaussian Elimination | 68 |
heavy-light 분할 | Heavy-light Decomposition | 68 |
비트 집합 | Bit Set | 67 |
순열 사이클 분할 | Permutation Cycle Decomposition | 66 |
모듈로 곱셈 역원 | Modular Multiplicative Inverse | 63 |
최대 유량 최소 컷 정리 | Max-flow Min-cut Theorem | 61 |
오일러 경로 | Eulerian Path / Circuit | 54 |
물리학 | Physics | 53 |
큐 | Queue | 52 |
단절점과 단절선 | Articulation Points And Bridges | 51 |
2-sat | 2-sat | 49 |
0-1 너비 우선 탐색 | 0-1 Bfs | 45 |
외판원 순회 문제 | Travelling Salesman Problem | 44 |
기댓값의 선형성 | Linearity Of Expectation | 44 |
퍼시스턴트 세그먼트 트리 | Persistent Segment Tree | 43 |
페르마의 소정리 | Fermat's Little Theorem | 42 |
다각형의 넓이 | Area Of A Polygon | 41 |
중국인의 나머지 정리 | Chinese Remainder Theorem | 37 |
선인장 | Cactus | 37 |
이중 연결 요소 | Biconnected Component | 36 |
mo's | Mo's | 34 |
벨만–포드 | Bellman–ford | 33 |
평면 그래프 | Planar Graph | 33 |
확장 유클리드 호제법 | Extended Euclidean Algorithm | 31 |
병렬 이분 탐색 | Parallel Binary Search | 31 |
볼록 다각형 내부의 점 판정 | Point In Convex Polygon Check | 31 |
오일러 피 함수 | Euler Totient Function | 31 |
비둘기집 원리 | Pigeonhole Principle | 31 |
연결 리스트 | Linked List | 30 |
이분 그래프 | Bipartite Graph | 30 |
분할 정복을 사용한 최적화 | Divide And Conquer Optimization | 29 |
스플레이 트리 | Splay Tree | 28 |
다차원 세그먼트 트리 | Multidimensional Segment Tree | 27 |
벌리캠프–매시 | Berlekamp–massey | 26 |
회전하는 캘리퍼스 | Rotating Calipers | 25 |
머지 소트 트리 | Merge Sort Tree | 25 |
아호-코라식 | Aho-corasick | 24 |
정규 표현식 | Regular Expression | 24 |
덱을 이용한 다이나믹 프로그래밍 | Dynamic Programming Using A Deque | 24 |
오일러 지표 (χ=v-e+f) | Euler Characteristic (χ=v-e+f) | 24 |
링크/컷 트리 | Link/cut Tree | 22 |
커넥션 프로파일을 이용한 다이나믹 프로그래밍 | Dynamic Programming Using Connection Profile | 22 |
매내처 | Manacher's | 21 |
라빈–카프 | Rabin–karp | 21 |
함수 개형을 이용한 최적화 | Slope Trick | 21 |
반평면 교집합 | Half Plane Intersection | 21 |
뫼비우스 반전 공식 | Möbius Inversion | 19 |
폴라드 로 | Pollard Rho | 19 |
트리 동형 사상 | Tree Isomorphism | 19 |
밀러–라빈 소수 판별법 | Miller–rabin | 18 |
헝가리안 | Hungarian | 17 |
선형 계획법 | Linear Programming | 17 |
홀의 결혼 정리 | Hall's Theorem | 16 |
오목 다각형 내부의 점 판정 | Point In Non-convex Polygon Check | 15 |
수치해석 | Numerical Analysis | 15 |
서큘레이션 | Circulation | 15 |
aliens 트릭 | Aliens Trick | 14 |
통계학 | Statistics | 14 |
담금질 기법 | Simulated Annealing | 14 |
오프라인 동적 연결성 판정 | Offline Dynamic Connectivity | 13 |
쌍대 그래프 | Dual Graph | 13 |
보로노이 다이어그램 | Voronoi Diagram | 12 |
뤼카 정리 | Lucas Theorem | 12 |
쌍대성 | Duality | 12 |
부분집합의 합 다이나믹 프로그래밍 | Sum Over Subsets Dynamic Programming | 12 |
일반적인 매칭 | General Matching | 11 |
매트로이드 | Matroid | 10 |
키타마사 | Kitamasa | 10 |
이산 로그 | Discrete Logarithm | 9 |
최소 외접원 | Minimum Enclosing Circle | 9 |
생성 함수 | Generating Function | 9 |
트리 분할 | Tree Decomposition | 9 |
번사이드 보조정리 | Burnside's Lemma | 8 |
양방향 탐색 | Bidirectional Search | 8 |
트리 압축 | Tree Compression | 8 |
회문 트리 | Palindrome Tree | 7 |
도미네이터 트리 | Dominator Tree | 7 |
안정 결혼 문제 | Stable Marriage Problem | 7 |
utf-8 입력 처리 | Utf-8 Inputs | 7 |
z | Z | 6 |
크누스 최적화 | Knuth Optimization | 6 |
탑 트리 | Top Tree | 6 |
이산 제곱근 | Discrete Square Root | 6 |
단조 큐를 이용한 최적화 | Monotone Queue Optimization | 6 |
4차원 이상의 기하학 | Geometry; Hyperdimensional | 5 |
로프 | Rope | 5 |
춤추는 링크 | Dancing Links | 5 |
크누스 x | Knuth's X | 5 |
접미사 트리 | Suffix Tree | 5 |
픽의 정리 | Pick's Theorem | 5 |
데카르트 트리 | Cartesian Tree | 5 |
델로네 삼각분할 | Delaunay Triangulation | 4 |
유향 최소 신장 트리 | Directed Minimum Spanning Tree | 4 |
스토어–바그너 | Stoer–wagner | 4 |
베이즈 정리 | Bayes Theorem | 4 |
히르쉬버그 | Hirschberg's | 4 |
그린 정리 | Green's Theorem | 4 |
차수열 | Degree Sequence | 4 |
현 그래프 | Chordal Graph | 4 |
보이어–무어 다수결 투표 | Boyer–moore Majority Vote | 3 |
경사 하강법 | Gradient Descent | 3 |
차분 공격 | Differential Cryptanalysis | 2 |
도형에서의 불 연산 | Boolean Operations On Geometric Objects | 2 |
하켄부시 게임 | Hackenbush | 2 |
레드-블랙 트리 | Red-black Tree | 1 |
이산 k제곱근 | Discrete K-th Root | 1 |
a* | A* | 1 |
다중 대입값 계산 | Multipoint Evaluation | 1 |
생일 문제 | Birthday Problem | 1 |
다항식 보간법 | Polynomial Interpolation | 1 |
함수형 그래프 | Functional Graph | 1 |
백준에서 분류한 알고리즘 방식이다. 굉장히 많아서 당황스럽겠지만, 자주 쓰이는 것만 잘 체득하는 게 우선이라고 생각했다.
나의 논리는 문제 내기 쉬워서도 있겠지만, 그만큼 자주 쓰이고 필요하니까 많은 출제를 하지 않았을까?
중요성이 높은만큼 출제되지 않았을까? 라는 의문이다.
위와 같은 카테고리와 관련된 문제들을 잘 이해하면 좋을 것 같다고 생각이 들었다.
그리고, 언어마다 변수나 자료구조를 선언하는 것이 달라서, 굉장히 머리를 써야하는 경우도 있다. 대부분 파이썬은 itertools, enumerate 덕분에 굉장히 편하게 문제를 푸는데, 다른 언어들은 정말 쉽지않다.
오늘 수업 내용은 직접적인 언급은 없으셨지만 binary search에 대한 내용이었다.
물론 한번에 바로 되진 않았지만, 시행착오를 조금 거쳐서 소스코드를 만들었다.
또한, decorator 를 사용했는데, 교수님께서 args 와 kwargs 에 대해서 학습해오라고 지시 주셨다.
import datetime
import time
def main():
list_ = list(range(100000000))
binary_search(list_, 23549)
def time_checker(func):
def wrapper(*args):
print(f'{func.__name__} 시작')
start_time = time.time()
func(*args)
end_time = time.time()
required_second_time = (end_time - start_time)
print(f'함수종료 | 소요시간 : {required_second_time:.10f}s')
return wrapper
# 속도 테스트
@time_checker
def function_1():
list_ = list(range(100000))
@time_checker
def function_2():
list_ = [x for x in range(100000)]
@time_checker
def function_3():
list_ = list()
for i in range(100000):
list_.append(i)
@time_checker
def find_algorithm_with_for(value):
list_ = list(range(100000))
for i in list_:
if i == value:
print(i)
break
@time_checker
def binary_search(list_, target_value):
low = 0
high = len(list_)
while low <= high:
mid = low + (high - low) // 2
if list_[mid] == target_value:
print(mid)
return
elif list_[mid] < target_value:
low = mid + 1
else:
high = mid - 1
raise "No match Element!"
if __name__ == '__main__':
main()
매우 빨라서 소요시간이 안찍힌다. (이미 정렬되어있으니까..)
※ *args vs **kwargus
args: argument 약자, *(asterick) 는 unpacking operator이다.
python에는 unpacking을 통해 argument를 한번에 전달할 수 있다.
**kwargs 또한 unpacking 방식이며 keyword로 parameter 를 전달해야할 경우에 작성한다.
함수의 모양은 바뀌지 않았지만? 인자(parameter)를 전달하는 방법을 다양하게 접근할 수 있어 매우매우 유용하다.
다음은 예시이다.
def main():
name = 'gwang'
age = 31
packing_func(name, age)
a_list = [name, age]
unpacking_func_args(*a_list)
a_dict = dict()
a_dict.update({'age': age, 'name': name})
unpacking_func_kwargs(**a_dict)
def packing_func(name, age):
print(f"안녕 나는 {name}! {age}살이야")
def unpacking_func_args(name, age):
inner_name = name
inner_age = age
print(f"안녕 나는 {inner_name}! {inner_age}살이야")
def unpacking_func_kwargs(name, age):
inner_name = name
inner_age = age
print(f"안녕 나는 {inner_name}! {inner_age}살이야")
if __name__ == '__main__':
main()
안녕 나는 gwang! 31살이야
안녕 나는 gwang! 31살이야
안녕 나는 gwang! 31살이야
감사합니다.