본문 바로가기

분류 전체보기

(386)
[c++] 백준 2156 포도주 시식 백준 단계별로 풀어보기 [동적계획법 1] 포도주 시식 https://www.acmicpc.net/problem/2156 2156번: 포도주 시식 효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규 www.acmicpc.net [풀이] 이전에 했던 계단오르기와 매우 유사한 동적프로그래밍 문제이다. 따라서 3번 연속 포도주를 마시면 안되기 때문에 다음과 같은 점화식이 도출된다. 1. max[n] = max[n-2] + juice[n] 2. max[n] = max[n-3] + juice[n-1] + juice[n] 다만 계단 오르기 문제와 다르게 유의해야 할 점은 마지막 ..
[알고리즘] 백트래킹(Backtracking) 알고리즘 1. 백트래킹 알고리즘 : 해를 찾는 도중에 막히면 되돌아가서 다시 해를 추적해나가는 방법. 되추적(Backtracking)이라고 부른다. 가능한 모든 방법을 탐색하는 것에는 깊이 우선 탐색(Depth First Search)가 있는데, 이는 가능한 모든 곳을 방문하기 때문에 경우에 따라 매우 비효율적일 수 있다. 백트래킹은 해를 찾아가는 도중, 현재 경로가 해가 될 것 같지 않으면 그 경로를 계속 가지 않고 되돌아간다. 따라서 비효율적인 경로를 차단하여 고려하지 않는 효율적인 기법이다. 이를 가지치기(pruning)라고 하는데, 가지치기를 얼마나 잘하느냐에 따라 백트래킹 알고리즘의 효율성이 결정된다. 가지치기(pruning) : 경로를 진행하다 해가 될 가능성이 없다고 판단하면 백트래킹(Backtrac..
[c++] 백준 9663 N-Queen 백준 단계별로 풀어보기 [백트래킹] N-Queen https://www.acmicpc.net/problem/9663 9663번: N-Queen N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오. www.acmicpc.net [풀이] 배치된 퀸이 n개가 되면 경우의 수 증가, 새로운 퀸은 배치된 퀸의 같은 행, 같은 열, 대각선에 위치해서는 안된다. 따라서 어차피 한 행에 하나의 퀸 밖에 놓지못하므로 이차배열을 사용하지 않고 col[]배열을 선언해 사용한다. col[1] = 1은 첫번째 열에 위치한 퀸의 행이 1행임을 의미한다. (x, y)와 (a, b)에 대해서 두 좌표가 대각선에 ..
[c++] 백준 2579 계단 오르기 백준 단계별로 풀어보기 [동적계획법1] 계단 오르기 https://www.acmicpc.net/problem/2579 2579번: 계단 오르기 계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. 과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점 www.acmicpc.net [풀이] 계단은 한번에 한계단 또는 두계단을 올라야 하며, 연속된 세 계단을 모두 밟으면 안된다. 마지막 계단은 반드시 밟아야한다. 즉 목표계단을 중심으로 목표계단과 그 전 계단을 밟은 경우, 목표계단과 그로부터 2단계 전 계단을 밟은 경우를 계산해주면 된다. 예를 들어, 6번째 계단을 오르는 점수의 최댓값은 또는 중 더 큰 값이 된다. -> m[]을 1~n..
[c++] 백준 1932 정수 삼각형 백준 단계별로 풀어보기 [동적계획법1] 정수 삼각형 https://www.acmicpc.net/problem/1932 1932번: 정수 삼각형 첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다. www.acmicpc.net [풀이] 대각선 오른쪽 위와, 왼쪽 위 중 더 큰 값과의 합을 구해 나간다. -> path[i][j] = std::max(path[i - 1][j - 1], path[i - 1][j]) + tri[i][j]; [코드] #include #include #include int main() { // 정수 삼각형, 합이 최대가 되는 경로 int n; int tri[502][502]; int path[502][502]; std..
[c++] 백준 1149 RGB 거리 백준 단계별로 풀어보기 [동적계획법] RGB 거리 https://www.acmicpc.net/problem/1149 1149번: RGB거리 첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나 www.acmicpc.net [풀이] n개의 집을 빨,초,파 중 하나로 칠해야 한다. 같은 색이 연속으로 반복되면 안될 때 모든 집을 칠하는 비용의 최솟값을 구하는 문제이다. 동적계획법으로 이 문제를 풀 때, 생각해야 할 것은 당장의 최솟값을 구해 더하는 것이 전체의 최솟값이 되지 않는다는 것이다. 예를 들어, 다음과 같이 3개의 집에 대해 빨,초,파 비..
[c++] 백준 1920 수 찾기 백준 단계별로 풀어보기 [이분 탐색] 수 찾기 https://www.acmicpc.net/problem/1920 1920번: 수 찾기 첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들 www.acmicpc.net [풀이] 이진 탐색으로 find 배열의 수가 arr 배열에 존재하는지 검색하고, 존재하면 1을 존재하지 않으면 0을 출력한다. [코드] #include #include #include int arr[100001]; int find[100001]; int binary_search(int as, int ae..
[c++] 백준 2740 행렬 곱셉 백준 단계별로 풀어보기 [분할 정복] 행렬 곱셈 https://www.acmicpc.net/problem/2740 2740번: 행렬 곱셈 첫째 줄에 행렬 A의 크기 N 과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 순서대로 주어진다. 그 다음 줄에는 행렬 B의 크기 M과 K가 주어진다. 이어서 M개의 줄에 행렬 B의 원소 K개 www.acmicpc.net [풀이] n*m의 행렬 a와 m*k의 행렬 b가 주어졌을 때, 두 행렬을 곱하는 프로그램. O(n^3)의 시간복잡도. [코드] #include #include #include int mat_a[100][100]; int mat_b[100][100]; int mat_c[100][100]; int main() { //n*m의 행렬 a와..