분류 문제
수학 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살이야

 

감사합니다.

+ Recent posts