본문 바로가기

Algorithm/Etc

(55)
다익스트라(Dijkstra) 알고리즘 23. 다익스트라(Dijkstra) 알고리즘 다익스트라(Dijkstra) 알고리즘은 다이나믹 프로그래밍을 활용한 대표적인 최단 경로(Shortest Path) 탐... blog.naver.com 1. 출발 노드를 설정합니다. 2. 출발 노드를 기준으로 각 노드의 최소 비용을 저장합니다. 3. 방문하지 않은 노드 중에서 가장 비용이 적은 노드를 선택합니다. 4. 해당 노드를 거쳐서 특정한 노드로 가는 경우를 고려하여 최소 비용을 갱신합니다. 5. 위 과정에서 3번 ~ 4번을 반복합니다. 최소 비용을 단순히 선형 탐색으로 찾도록 만들었습니다. 이렇게 작성하는 경우 다익스트라의 시간 복잡도가 O(N^2)으로 형성됩니다. 따라서 최대한 빠르게 작동시켜야 하는 경우 힙 구조를 활용하여 시간 복잡도 O(N * lo..
순열 알고리즘 (Permutation Algorithm) 사전순으로 출력되지 않는다는 점을 주의해야겠다. 1 2 3 1 3 2 2 1 3 2 3 1 3 2 1 3 1 2 위와 같이 출력된다. 사전순으로 출력된다면 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 이어야 한다. #include #include #include using namespace std; /* 순열 알고리즘 */ void Permutation(vector& Array, int Start, int End) { if (Start == End) { for (const auto it : Array) { cout
endl과 \n, flsuh 풀이법은 맞는데 계속 시간 초과가 나서 뭔가 했는데 endl이 문제였다. endl은 flush를 겸하기 때문에 매우 매우 매우 매우 매우 느립니다. '\n'을 대신 사용하세요. 항상 flush를 해서 느린 c++ endl 1 버퍼의 내용을 모두 지운다. 2 버퍼의 내용을 모두 처리한다. (여기서 처리한다는 그냥 버리는게 아니다) stream에서 어딘가로 written을 한다. 그리고 내부적으로는 버퍼로 구현된. 이라는 게 눈에 들어옵니다. endl을 만난 경우에, '\n'을 추가하고, flush를 하는데요. 버퍼링 정책이 버퍼가 꽉 찼을 때 출력하는 정책이라 해도, endl을 넣으면 강제로 flush가 됩니다. 이게 얼마나 큰 차이냐. 라고 다시 되물으신다면, 위에서 strace 한 결과를 보여드렸으니,..
지도에서 DFS, BFS DFS 지도에서 DFS는 한 가지 방법으로 갈 때까지 가보는 방식이라고 생각한다. - 백트랙킹 방식이라 생각하고 visit 표시를 해줘야 한다. 중복 방지를 위해서 체크하는 방법은 자주 활용되므로 잘 익혀둘 수 있도록 한다. 그리고 만약 n 의 크기가 10,000이상의 값이라면 어떻게 해결해야할지 고민해보기 바란다. 이 방법들은 모두 시간이 너무 많이 걸리기 때문에  값이 커질 경우 제한된 시간 이내에 해를 구할 수 없다. BFS BFS는 한 칸에 대한 데이터가 중요하고 그것을 저장하는 것이다. 최단거리 문제
Deque 덱은 양쪽 끝에서 삽입과 삭제가 모두 가능한 자료 구조의 한 형태이다. 두 개의 포인터를 사용하여, 양쪽에서 삭제와 삽입을 발생 시킬 수 있다. 큐와 스택을 합친 형태로 생각할 수 있다.
DP 하면서 틀리는 것 / DFS하면서 틀리는 것 DP 하면서 틀리는 것 - 변수형 사이즈 - DP배열 초기화 - DP배열 시작 인덱스 DFS하면서 틀리는 것 - 아무것도 포함하지 않는 경우는 제외한다. - 종료 조건 - depth 종료 조건
[DP] 부분집합의 합 n번째까지 고려했을 때 합이 m인 부분집합이 존재하는가? 합이 0인 것은 공집합이다. 이전에 만든 값이 이미 원하는 합을 만들어놨는가? -> 그렇다면 만들 수 있으므로 true 아니면 이번에 새로 추가를 하면 원하는 합이 만들어지는가? 현재 원하는 합에서 새로 추가한 값을 뺀 경우가 만들어져 있는가? -> 그렇다면 만들 수 있으므로 true optimal substructure를 갖고 있으므로 새로 추가된 값에 대해서만 고려한다. 작은 부분에 대해서는 이미 다 구했다고 가정한다. 부분집합을 찾고자 한다면 n번째까지 고려했을 때 가능한지 생각해봐야한다. [동적 프로그래밍 예제] 부분집합의 합(C언어) [동적 프로그래밍(DP)] 부분집합의 합 본 포스팅은 도서 "문제로 풀어보는 알고리즘"(황인욱, 김용혁 지..
Union find make-set union(x, y) = y를 x의 자손으로 넣음 [알고리즘] Union-Find 알고리즘 - Heee's Development Blog Step by step goes a long way. gmlwjd9405.github.io weighting rule for union( i, j ) collapsing find set
Graph 사이클 찾기 back_edge가 존재하면 사이클이 존재한다는 얘기 Q. 그래프에서 사이클이 이란 ? 그래프의 특정 정점에서 출발하여 돌아다니다가 다시 처음 출발했던 곳으로 되돌아 갈 수 있으면 사이클이 있다고 한다. 그림1에서 (a)는 Tj(출발) → Tn → Tm → Tj(출발지점으로 다시 돌아옴) 으로 순환되는 사이클이 있지만 (b)는 어디에서 출발하던 출발지점으로 다시 돌아올수 있는 방법이 없다. 즉 사이클이 존재하지 않는다. Q. 사이클을 찾는다는 것은? 사이클을 검출(detect) 한다는 것은 그래프내에 사이클이 있는가? 있다면 총 몇 개 존재하는가 ? 그리고 사이클에 포함된 노드의 개수는 몇 개인가? 등을 알아내는 것이다. 어떠한 이유로 그래프 자료구조를 이용해 다양한 문제를 풀다보면 그래프내 사이클을 찾..
Topology sort(위상 정렬) [알고리즘] 위상 정렬(Topological Sort)이란 - Heee's Development Blog Step by step goes a long way. gmlwjd9405.github.io 방향그래프의 정보를 저장하고 있는 파일을 읽어 다음의 두 가지 중에 하나를 출력하는 코드를 작성하시오. 그래프는 연결되어(connected) 있다고 가정해도 됩니다. (1) 노드들의 topological ordering을 출력 (이 경우는 cycle이 없는 것을 의미합니다.) 또는 (2) 존재하는 하나의 cycle을 출력 25. 위상 정렬(Topology Sort) 위상 정렬(Topology Sort)은 '순서가 정해져있는 작업'을 차례로 수행해야 할 때 그 순서를 결정해주기 ... blog.naver.com ..
인접 리스트 초기화 후에 접점만큼 add하고 시작해야 함 listGraph만 생성된 상태고 그 안에는 아무것도 없음 Java 인접행렬과 인접리스트를 이용하여 그래프 구현하기 Java 인접행렬과 인접리스트를 이용하여 그래프 구현하기 Java로 인접행렬과 인접리스트를 만들어 그래프를 구현하는 방법에 대해 알아보겠습니다. 1. 그래프 (Graph) 수학적 정의로 그래프는 객 freestrokes.tistory.com
[Greedy Algorithm] Coin Change, greedy choice property www.cs.toronto.edu/~denisp/csc373/docs/greedy-coin-change.pdf www.chegg.com/homework-help/introduction-to-algorithms-2nd-edition-chapter-16.p-solutions-9780262032933
최대, 최소 Heap 힙 정렬은 완전 이진 트리의 한 종류인 힙 트리를 이용하여 정렬하는 알고리즘입니다. 먼저 힙 트리가 무엇인지 살펴본 후에 힙 정렬 알고리즘을 알아보고 분석 및 구현해 봅시다. 힙 트리는 부모의 값이 자식의 값보다 큰 값을 보장하는 최대 힙과 작은 값을 보장하는 최소 힙이 있습니다. 최대 힙으로 표현한 힙 트리의 루트에는 가장 큰 값을 갖고 최소 힙으로 표현하면 가장 작은 값을 갖습니다. 힙 트리처럼 완전 이진 트리는 배열로 많이 표현합니다. 완전 이진 트리가 아닌 이진 트리도 배열로 표현할 수 있지만 트리의 높이가 높아지고 한 쪽으로 기울어질 수록 비어있는 공간이 많아져서 메모리 효율이 떨어집니다. 하지만 완전 이진 트리는 마지막 자료가 있는 공간까지 모두 사용하여 빈 공간이 생기지 않습니다.
우선순위 큐 우선순위 큐는 평범한 큐나 스택과 비슷한 축약 자료형이다. 그러나 각 원소들은 우선순위를 갖고 있다. 우선순위 큐에서, 높은 우선순위를 가진 원소는 낮은 우선순위를 가진 원소보다 먼저 처리된다 우선순위 큐가 힙이라는 것은 널리 알려진 오류이다. 우선순위 큐는 "리스트"나 "맵"과 같이 추상적인 개념이다; 마치 리스트는 연결 리스트나 배열로 구현될 수 있는 것과 같이, 우선순위 큐는 힙이나 다양한 다른 방법을 이용해 구현될 수 있다. 우선순위 큐는 최소한 다음의 연산이 지원 되어야 한다: insert_with_priority: 하나의 원소를 우선순위를 지정하여 큐에 추가한다. pull_highest_priority_element: 가장 높은 우선순위를 가진 원소를 큐에서 제거하고 이를 반환한다.이것은 "p..
Huffman code 허프만 부호화 또는 허프만 코딩(Huffman coding)은 입력 파일의 문자 빈도 수를 가지고 최소힙을 이용하여 파일을 압축하는 과정이다. 허프만 코드(이진코드)는 Unix에서 파일압축에 사용되고, JPEG 이미지 파일 또는 MP3 음악 파일을 압축하기 위한 서브루틴으로도 활용된다. 주어진 문자열을 트리를 이용해 2진수로 압축하는 알고리즘 중 하나이다. 최소 힙을 이용한다. 고정 길이 코드(fixed length code) vs 접두어 코드(prefix code) 고정 길이 코드는 대표적으로 아스키 코드가 있다. 아스키 코드는 항상 8bit의 길이를 가지고있다. 다루기에는 간단하지만, 저장 공간 활용에 있어서 제한이 있다. 이를 해결하기 위해서 가변 길이 코드(variable length code)가..
Greedy Algorithm2 • What did we do for activity selection? 1. Determine the optimal substructure. 2. Develop a recursive solution. 3. Prove that at any stage of recursion, one of the optimal choices is the greedy choice. Therefore, it’s always safe to make the greedy choice. 4. Show that all but one of the subproblems resulting from the greedy choice are empty. 5. Develop a recursive greedy algorithm. 6. Convert ..
Queue / Stack 큐는 컴퓨터의 기본적인 자료 구조의 한가지로, 먼저 집어 넣은 데이터가 먼저 나오는 FIFO 구조로 저장하는 형식을 말한다. 영어 단어 queue는 표를 사러 일렬로 늘어선 사람들로 이루어진 줄을 말하기도 하며, 먼저 줄을 선 사람이 먼저 나갈 수 있는 상황을 연상하면 된다.
[Greedy Algorithm] coin change 이 탐욕 알고리즘으로 거스름돈 교환 문제를 풀게 된다면, 큰 단위의 동전이 작은 단위의 동전의 배수가 되어야 탐욕 알고리즘을 적용할 수 있습니다. 위 같은 경우는, 10원 동전은 1과 5의 배수이고, 5는 1의 배수이므로 탐욕 알고리즘을 적용할 수 있었던 것입니다. 유의하셔야 할 점은 매 순간마다 최선의 선택을 하여 나온 해가 반드시 전체적인 최적해는 아니라는 것입니다. 그렇기 때문에, 탐욕 알고리즘을 사용할 때에는 전체적인 최적해 인지를 항상 염두해 두실 필요가 있습니다. 즉, 탐욕 알고리즘을 사용하시기 전에 탐욕 알고리즘을 사용해도 되는지 검증 단계를 거치시는게 좋습니다. greedy 알고리즘을 사용하면 좋은 경우 1. 최적 부분 구조 (Optimal Substructure) - 부분 문제를 최적화하..
[DFS] 저울 추 ( p. 197 ) 오른쪽에 모든 추를 놓아본다. 마지막 추에 대해 무게가 안 맞으면 해당 추를 왼쪽에 놓아본다. 반복문으로 중심이 되는 추가 있다. 중심이 되는 추에 대해 위의 과정을 반복하는 것이다. ex) n=10일 때, 추 ={ 1, 3, 9 } 중심 추 1일 때(반복문에서 i=0) (10) / 1, 3, 9 9 (10) / 1, 3 3, 9, (10) / 1 1,3, 9, (10) / 중심 추 3일 때(반복문에서 i=1) (10) / 3, 1, 9 9 (10) / 3, 1 1, 9, (10) / 3 3, 1, 9, (10) / 중심 추 9일 때(반복문에서 i=2) (10) / 9, 1 ===============> 끝 3 3 (10) / 9, 1 1, 3, (10) / 9 9, 3, 1, (10) / 1. 어떤 작..
Greedy Algorithm 그리디 알고리즘은 동적 프로그래밍 사용 시 지나치게 많은 일을 한다는 것에서 착안하여 고안된 알고리즘입니다. 동적 프로그래밍을 대체하는 것은 아니고 같이 쓰이며 서로 보완하는 개념입니다. 그리디 알고리즘은 탐욕 알고리즘 또는 욕심쟁이 알고리즘이라고도 불리는데요. 미래를 생각하지 않고 각 단계에서 가장 최선의 선택을 하는 기법입니다. 이렇게 각 단계에서 최선의 선택을 한 것이 전체적으로도 최선이길 바라는 알고리즘이죠. 물론 모든 경우에서 그리디 알고리즘이 통하지는 않습니다. 쉬운 예를 들자면 지금 선택하면 1개의 마시멜로를 받고, 1분 기다렸다 선택하면 2개의 마시멜로를 받는 문제에서는, 그리디 알고리즘을 사용하면 항상 마시멜로를 1개밖에 받지 못합니다. 지금 당장 최선의 선택은 마시멜로 1개를 받는 거지..
[DFS] 두 색 칠하기, bicoloring ( p. 171 ) for i 점의 갯수 G[v][i] 연결되어 있고 색이 현재 칠하려는 색과 같다면 can = 0 칠할 수 있는 자리가 아니다. can이 0 이라면 다시 현재 V정점 visited[V] 0으로 칠하고 return for i 점의 갯수 G[v][i] 연결되어 있고 색이 안칠해진 부분이라면 dfs( i, 1 ) // 그 정점으로 가서 1로 칠하고 나머지 연결된 부분 확인 dfs( i, 2 )
[DFS] 치즈 ( p. 161 ) 바깥 공기 -1 바깥 공기에 붙어 있고 1인 위치 +1 done() : 녹을 자리에 있다면 두 군데 이상에서 +1이 됐을 것이므로 2보다 클 것이다. -> 0으로 만들어준다. -1인 자리 기존에 0이었던 자리 -> 0으로 만들어준다. 2나 1인 자리는 아직 녹지 않았거나 0인 자리를 탐색할 때 건드려지지 않은 부분이다. -> 다시 1로 만든다. 다시 탐색
[DFS] flood fill ( p.78 ) 이와 같이 그래프로 만든 다음 배열의 (0, 0)부터 순차탐색을 진행하면서 (a, b)의 값이 만약 1이라면 이 점을 시작으로 하여 깊이우선탐색을 이용하여 모든 연결된 점을 방문하고 특정 값으로 체크한다. 나머지 점들도 모두 순차탐색하면서 마지막 까지 깊이우선탐색을 실행하고 알고리즘을 종료한다. 마지막에 깊이우선탐색을 실행한 횟수가 두더지의 수가 되고, 각 두더지 굴의 크기는 다른 배열에 저장해 둔 다음 마지막에 std::sort()를 이용하여 정렬한 후 내림차순으로 출력하면 된다. 여기에 사용되는 알고리즘은 지뢰찾기, 뿌요뿌요 등의 게임에 많이 활용되는 방법으로서, flood fill이라고도 한다. 자주 등장하는 방법이므로 익혀두면 활용가치가 크다. 이 알고리즘에서는 재귀함수를 이용하여 깊이우선탐색을 ..
[DFS, BFS] 리모컨 백트래킹은 모든 호출이 끝이 나야만 해답을 찾을 수 있기 때문에, 이러한 깊이우선 탐색은 이 문제에서 비효율적이다. 이 방법 대신 너비우선탐색 기법을 이용하여 버튼 누름 횟수를 기준으로 가장 먼저 목표 온도에 도달할 때까지 탐색하고 중단하는 방법으로 설계해 보자. 34도에 도달하게 되면 모든 연산을 중지하고 결과를 얻을 수 있다. 너비우선탐색으로 탐색하여 목표 온도에 도달하는 경우 계산량은 이 탐색 버튼의 수 3과 목표 온도에 도달하는 최적의 횟수 cnt에 비례하므로 계산량을 줄일 수 있다. 순서대로 하면 cnt가 적은 순서대로 차례로 계산이 된다. 목표 온도에 도달하면 가장 적은 cnt로 도달한 것임을 알 수 있다.
count inversion using merge sort Count Inversions in an array | Set 1 (Using Merge Sort) - GeeksforGeeks A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions. www.geeksforgeeks.org people.cs.umass.edu/~sheldon/teaching/mhc/cs312/2013sp/Slides/Slides13%20-%20Counting%20Inve..
int형 최대, 최소 설정 int형의 최댓값은 0x7fffffff(2,147,483,647)이며, 최솟값은 0x80000000(-2,147,483,648)이다. 엄밀하게 최대, 최소를 지정할 때 이 값을 이용하면 되며, 16진법을 이용하면 쉽게 처리할 수 있다. 여기서 주의할 점은 위 값들을 설정한 후 값을 증가시키거나 감소시키면 오버플로 (overflow)로 인하여 답이 잘못될 수 있다. 예를 들어 다음 명령을 보자. 위 예의 경우에 max값이 최댓값이었는데, 여기서 1을 증가하면 오버플로가 발생하여 max값은 음수가 된다. 따라서 이런 점을 방지하기 위하여 적어도 2배 정도라 하더라도 오버플로가 발생하지 않도록 처리하는 경우가 많다. 이럴 때는 주로 최댓값을 987654321 등의 자릿수도 쉽게 알 수 있고 2배를 하더라도 정..
[DFS] n-Queen 같은 대각선 대각선은 기울기가 증가하는 대각선 부분과 기울기가 감소하는 부분의 2가지 대각선이 존재한다. 이 2가지 대각선에 대해서도 체크배열을 만들어서 활용할 수 있다. 기울기가 증가하는 대각선부터 살펴보면 다음과 같다. 위 대각선 상에 있는 칸의 특징을 보면 행+열의 값이 일정하다. n이 4일 경우 행+열의 최소값은 2이고 최댓값은 8이다. 따라서 기울기가 증가하는 대각선은 체크배열의 행+열 위치에 체크하여 기울기가 증가하는 대각선 상에 퀸을 놓을 수 있는지 없는지를 쉽게 확인할 수 있다. 기울기가 감소하는 대각선도 아래와 같은 특징이 있다. 기울기가 감소하는 대각선 부분은 행과 열의 차가 일정하다. 범위는 n이 4일 경우 –3에서 3까지의 값을 지닌다. 음의 값을 양의 값으로 보정하기 위해 n을 더..
[DFS] 두더지 굴 dfs 함수 부분의 4방향 탐색을 dx, dy를 이용하여 다음과 같이 편리하게 작성할 수 있다.
[DP]Stock max profit Dynamic Programming Interview Questions: How to Maximize Stock Profits Find the maximum profit given a list of stock prices medium.com
시간복잡도 ranking polynomial time . exponential time