Constructive 관찰(1)
·
📚알고리즘/알고리즘 이론
https://www.acmicpc.net/problem/315771. 랜섬웨어와 비트코인(G4)120까지 순회를 하는데 8개씩 끊어서 1부터20까지의 숫자를 저장할 수 있어야 함.사이클 돌리는 것을 mod연산으로 구현할 수 있어야 함arr[i%8] = i%20+1;  https://www.acmicpc.net/problem/240252. 돌의 정령 줄세우기특정 숫자에 맞추려고 하기 보단 INF, 0로 무조건 조건을 만족하는 경우를 생각1~N까지의 수를 뒤집고 시작  https://www.acmicpc.net/problem/139553. Key Knockingkey가 3의 배수로만 주어지는 점을 생각(왜 하필 3의 배수일까)→ 3개씩 비트를 붙이면서 가중치가 최대가 되도록 계산  https://www.a..
그리디 알고리즘(Greedy)
·
📚알고리즘/알고리즘 이론
Greedy 알고리즘은 매 단계에서 현재 상황에서 가장 최선이라고 생각되는 선택을 하는 방식으로 문제를 해결하는 알고리즘 기법이다.특정 상황에만 사용되는 최적의 해를 구하는데 사용한다. 정의만 보았을 때는 무슨 말인지 잘 이해가 안 갈수 있다.문제가 주어지면 어떻게 코드를 짜야지 가장 최고의 효율로 문제를 해결할 수 있는지 고민해야하는 문제다.즉, 특정 알고리즘 공식이 있는게 아니라 각 문제 상황마다 다른 최적의 해를 직접 구상해내야 한다.예시를 통해 알아보자거스름돈 문제[문제]거스름돈으로 줄 금액이 주어졌을 때 동전의 개수가 최소가 되도록 동전을 조합하라.단, 사용가능한 동전의 단위는 500원, 100원, 50원, 10원만 가능하다. 해당 문제에 대한 최적의 알고리즘을 구하기 위한 접근1. 현재 상황에..
동적 계획법(Dynamic Programming)
·
📚알고리즘/알고리즘 이론
DP: 한 문제를 해결하기 위해 문제를 부분 문제로 분할하여 해결하고 부분문제들의 해를 바탕으로 큰 문제를 해결하는 문제해결기법. 정의를 딱 보자마자 생각나는 생각이 분할정복이랑 비슷하다라는 생각이 든다. 하지만 내용은 문제를 나눈다는 사실을 제외하고는 비슷한 문제해결방법이 아니다. 심지어 문제를 나누는 것도 분할정복은 큰 문제라는 덩어리를 여러부분으로 쪼개는 느낌이고, DP는 큰 문제의 이전 단계의 경우를 생각하는 걸 문제를 나눈다고 한다. 분할정복: 큰 덩어리 문제를 작은 덩어리로 쪼개서 해결한 뒤에 합치는 방식으로 문제를 해결 DP : 큰 문제를 작은 부분 문제로 나누고 작은 부분 문제의 해을 저장하여 중복 계산을 피하거나, 작은 부분문제의 최적해로 점화식을 세워 큰 문제를 해결 DP는 문제 유형을..
분할정복(Divide and Conquer)
·
📚알고리즘/알고리즘 이론
● 분할정복(Divide and Conquer) 한번에 해결하기에 불가능하거나 매우 오래걸리는 문제를 작은 문제로 나눠서(분할) 해결하고 다시 결합하여(정복) 문제를 해결하는 방식 **앞서 포스팅 했던 이분탐색 또한 분할정복을 사용한 알고리즘 Merge sort(병합정렬) 분할정복을 이용한 정렬방법으로 O(NlogN)의 시간복잡도를 가지며 버블정렬, 삽입정렬, 선택정렬 보다 실행시간이 빠르다. (파이썬에 내장되있는 sort함수도 병합정렬) 병합정렬을 통해서 분할정복이 어떤식으로 이루어지는지 알아보자. 정렬을 하기 위해 임의의 무작위 배열 arr = [3, 25, 1, 75, 42, 100, 63, 38] 이 있다고 하자. 이 배열의 Divide 과정은 아래그림과 같다. 배열의 중간을 기준으로 더 이상 나..
스택 & 큐(Stack and Queue)
·
📚알고리즘/알고리즘 이론
스택과 큐는 데이터를 제한적으로 접근할 수 있는 나열 구조로 가장 기본적인 자료구조 중 하나이다. 1. 스택(Stack) 데이터를 차곡차곡 쌓아올린 형태의 자료구조로 후입선출(Last in First Out) 개념이다. 스택에 나중에 들어간 놈이 먼저 나온다고 생각하면 된다. 그림과 같이 Stack에 데이터를 추가하는 작업을 push, 제거하는 작업을 pop 이라고 한다. StackOverflow(오버플로우): 스택이 가득차서 더 이상의 데이터를 추가할 수 없는 경우 ● stack.push(x) - 스택에 데이터를 추가 ● stack.pop() - 스택의 최상위 데이터를 삭제 ● stack.top() - 스택의 최상위 데이터를 반환 ● stack.empty() - 스택이 비었는지 확인 ● stack.si..
이분 탐색(Binary Search)
·
📚알고리즘/알고리즘 이론
이분 탐색 또한 앞서 포스팅 했던 Brute force와 마찬가지로 solved.ac의 Class2에서 등장하는 알고리즘이다. 이분 탐색은 문제를 푸는 하나의 도구로 굉장히 중요하며 자유자재로 사용할 수 있어야 한다. 먼 미래지만 세그먼트 트리를 형성할 때 이분 탐색과 비슷한 형식으로 트리를 형성하고 그리디(Greedy) 등의 알고리즘과 함께 나와도 이상하지 않을 정도로 사용 빈도가 꽤 높다. 우리가 어떤 배열이나 벡터에서 숫자를 찾을 때 최악의 시간복잡도는 O(n)으로 선형 시간(Linear time)을 갖는다. (** 알고리즘의 실행 시간이 데이터가 증가함에 따라 선형적으로 증가할 때의 시간을 선형시간이라고 함.) 하지만 이분 탐색의 시간복잡도는 log2(n)으로 선형 탐색에 비해 빠른 시간 안에 원..
루오
'📚알고리즘/알고리즘 이론' 카테고리의 글 목록