본문 바로가기

Algorithm

(83)
[BOJ] 2110 공유기 설치 가장 인접한 공유기의 최대거리를 이분탐색을 이용해서 구한다는 것까지는 알겠는데 이걸 공유기 C개만큼이 가능한지 확인하는 방법을 생각하기가 어려웠다. 해결책을 보니 첫번째 집에 무조건 공유기가 설치된다고 가정하고 계산을 한다. 이건 이해가 아직도 잘 안간다. ▶(수정) 거리가 d보다 무조건 같거나 커야하므로 첫번째 집이 아니라 그 다음집부터 시작을 한다면 공유기가 있는 집들간의 거리는 당연히 줄어들 것이다. 그러니까 처음집부터 해야 거리가 좀 더 큰 영역을 확인을 할 가능성을 높일 수 있다. 마지막 줄의 답이 x이상일 수 있는가?에 대한 내용을 구현하는 것이 어려웠습니다. ​ 정리를 하자면 이렇습니다. 먼저 우린 문제에서 주어진 가장 인접한 공유기 간의 최대거리를 구해야합니다. ​ 즉, 공유기를 어디 어디..
[BOJ] 1707 이분 그래프 이분 그래프를 먼저 알고 이해하고 있어야 풀 수 있는 문제였다. bfs로만 풀어봤는데 우선 이분그래프를 다시 설명해보자면 서로 연결된 그래프가 있으면 그걸 두 집합으로 나누려고 한다. 이걸 색깔로 구분하는 것이다. 자신이랑 연결된 노드들은 다른 색으로 칠한다. 그게 불가능하다면 이분 그래프가 되지 못한다. 자신과 연결된 노드가 같은 집합에 속하는 것이 되기때문이다. 테스트케이스 11 3 1 2 3 3 2 1 3 2 3 4 4 1 2 2 3 3 4 4 2 3 2 2 1 3 2 4 4 2 1 3 2 4 3 4 1 5 2 1 5 1 2 5 2 1 2 2 5 4 3 1 2 4 3 2 3 4 4 2 3 1 4 3 4 1 2 3 3 1 2 2 3 3 1 2 1 1 2 예제 출력1 YES YES NO YES YES ..
[BOJ] 2422 별 찍기 - 5 이걸 이렇게 오래 붙잡고 있을 줄이야..... c언어에서 정말 구멍이 많음을 느낀다. for문으로 하는 단순한 방법 말고 이전에 교재에서 공부했던 재귀 방식으로 코드를 짜려고 하는데 계속해서 오류가 나서 도대체 뭔가 했다. 우선 string형이 c언어에는 없어서 직관적이지가 않았다. 자바로만 워낙에 쉽게쉽게 해버렸으니 str관련 함수를 많이 알아냈다. 그리고 무엇보다 중요한 건 복사를 해줘도 기존에 값은 그대로 저장되고 그 앞에 짧은 값만 복사가 돼서 값의 길이가 계속 그대로였다. str형은 마지막에 무조건 \0을 붙여줘야 문장이 끝나는 걸 알아야 한다. str관련 함수는 이번 기회에 잘 알아갔으면 좋겠다. 그리고 c++에서는 굳이 이렇게 하지 않아도 String형이 존재한다는 것을 코드를 다 짠다음에 ..
[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
[DP] LCS(Longest Common Subsequence, 최장 공통 부분 수열) 최장 공통 부분 수열 문제 최장 공통 부분 수열(LCS) 문제는 두 개의 문자열에서 순서대로 겹치는 문자가 최대 몇 개인지 구하는 문제입니다. 예를 들어 ABCBDAB와 BDCABA에서 LCS는 BCAB나 BDAB나 BCBA입니다. 앞에서부터 겹치는 것들을 찾아서 문자열을 만들 때 그것이 가장 길다면 LCS가 되는 거죠. 이 문제는 다음과 같이 분석할 수 있습니다. i라는 문자열과 j라는 문자열이 있다고 칩시다. lcs(i,j)는 이 두 문자열의 LCS 길이입니다. 만약 문자열의 마지막 두 문자가 같다면 lcs(i, j) = lcs(i-1, j-1) + 1과 같습니다. lcs(ABCBDAB, BDCAB)는 lcs(ABCBDA, BDCA) + 1과 같은 거죠. 만약 두 문자열의 마지막 문자가 다르다면, l..
Dynamic Programming 동적 프로그래밍은 이름이 조금 이상한데요. 프로그래밍은 컴퓨터 프로그래밍이라는 뜻이 아니라 테이블을 만든다는 뜻입니다. 그리고 전혀 다이나믹하지도 않습니다. 그래서 어떤 서울대 교수님은 동적 프로그래밍 대신 기억하기 프로그래밍이라는 용어를 쓰기도 합니다. 메모이제이션 강좌를 보셨나요? 재귀 호출 시, 반복적으로 계산되는 것들의 계산 횟수를 줄이기 위해 이전에 계산했던 값을 저장해두었다가 나중에 재사용하는 방법입니다. 메모이제이션이 동적 프로그래밍 중 하나입니다. 알고리즘을 짤 때 분할정복 기법을 사용하는 경우가 많습니다. 큰 문제를 한 번에 해결하기 힘들 때 작은 여러 개의 문제로 나누어서 푸는 기법인데요. 작은 문제들을 풀다보면 같은 문제들을 반복해서 푸는 경우가 생깁니다. 그 문제들을 매번 재계산하지..
Maximum single set profit courses.cs.washington.edu/courses/cse417/18wi/lectures/lec08-divide-and-conquer-4.pdf pythoncs.wordpress.com/2015/08/21/question-maximum-single-sell-profit-divide-and-conquer/ Question: Maximum Single-Sell Profit – Divide and Conquer Question: Given a list of stock prices, find out the maximum profit that can be earned in a single buy/sell transaction. This is a nice Divide and Conquer algorithm..