본문 바로가기

알고리즘(C++)

(28)
[백준] C++ 2156번 : 포도주 시식 풀이과정 2579번 : 계단 오르기 (https://yeodo95.tistory.com/21) 와 유사하다. 다른점은 마지막 포도주를 먹지 않아도 된다는 점이다. 조건은 1. N-1번째 포도주를 먹고, N번째 포도주를 먹은 경우 2. N-2번째 포도주를 먹고, N번째 포도주를 먹은 경우 3. N-1번째 포도주를 먹고, N번째 포도주를 먹지 않은 경우 총 세가지이다 따라서 점화식은 d[n] = max( max(d[i-3]+v[i-1]+v[i] , d[i-2] + v[i] ) , d[i-1] ) 이다. 1 2 3 코드 더보기 #include #include using namespace std; int main() { long long d[10001] = { 0, }; long long iValue[10001..
[백준] C++ 1932번 : 정수 삼각형 풀이과정 경로의 최대 합을 저장하는 배열(d)과 삼각형을 이루고 있는 배열(iValue)은 2차원 배열로 [y][x](y:높이,x:해당 층에서 몇번째인지)로 표현한다. d[n][1]~d[n][n]은 삼각형의 마지막 층에서 각 요소(x가 1~n일 때)로 끝났을 때 최대값이 저장되어있다. 이들 중 가장 큰 값이 정수 삼각형에서 얻을 수 있는 최대값이다. 이 문제의 점화식은 d[n][m] = iValue[n] + max(d[n-1][m-1],d[n-1][m]) 이다. 코드 더보기 #include #include using namespace std; int main() { int d[501][501] = { 0, }; int iValue[501][501] = { 0, }; int iInput = 0; cin >..
[백준] C++ 1149번 : RGB 거리 풀이과정 집의 수 N개가 빨강-0, 초록-1, 파랑-2 각각의 색으로 칠했을 때 드는 비용을 저장하는 배열(cost[N][3]) N번째 집을 빨강, 초록, 파랑으로 칠했을 때 드는 비용의 최솟값을 저장하는 배열(d[N][3]) 을 만든다. d(n) = n번째 집을 색칠하는 색과 이전의 집을 색칠한 색이 같으면 규칙에 어긋난다. 예를 들어 n번째 집을 빨간색으로 색칠한다면 이전의 집은 초록색이거나 파란색이어야한다. 비용의 최소값을 구하는 문제이기 때문에 이전 집까지 색칠한 했을 때, 초록색과 파란색 중 더 적은 비용을 선택해 준다. 이를 식으로 나타내면 d(n) = cost[n][0] + min(d[n-1][1],d[n-1][2]가 된다. 최종적으로 N번째 집까지 규칙에 맞게 색칠하면 N번째 집 빨강 ->..
[백준] C++ 11726번 : 2×n 타일링 풀이과정 Dynamic Programming을 사용한다. 점화식을 구하면 1.f(1)일 때 1가지 방법이 있다. 2.f(2)일 때 2가지 방법이 있다. 3. n이 2보다 클 때 f(n)일 때, f(n) = f(n-1) + f(n-2) 코드 더보기 #include using namespace std; int main() { int d[1001] = { 0, }; int iInput = 0; d[1] = 1; d[2] = 2; cin >> iInput; for (int i = 3; i
[백준] C++ 1003번 : 피보나치 함수 풀이과정 Dynamic Programming을 사용한다. 점화식을 구하면 1.f(0)일 때 0은 1, 1은 0번 출력된다. 2.f(1)일 때 0은 0, 1은 1번 출력된다. 3. n이 2보다 클 때 f(n)일 때, 0은 f(n-1)의 0 출력 횟수, f(n-2)의 0 출력 횟수 번 출력 된다. 1은 f(n-1)의 1 출력 횟수, f(n-2)의 1 출력 횟수 즉, f(n) = f(n-1) + f(n-2) 0과 1의 출력 횟수를 나타내는 pair형 배열 d[41](n이 40보다 작거나 같다) 에 점화식에 맞게 0과 1의 출력 횟수를 대입해준다. 코드 더보기 #include using namespace std; int main() { pair d[41] = { { 1,0 } ,{ 0, 1 } , }; int ..
[백준] C++ 2579번 : 계단 오르기 풀이과정 내용 코드 더보기 #include #include using namespace std; const int MAX = 301; int main() { int dp[MAX] = { 0, }; int stair[MAX] = { 0, }; int N = 0; cin >> N; for (int i = 0; i > stair[i+1]; dp[1] = stair[1]; dp[2] = dp[1] + stair[2]; dp[3] = dp[1] + stair[3]; for (int i = 4; i
[백준] C++ 9095번 : 1, 2, 3 더하기 풀이과정 1. 재귀 함수를 사용한다. 재귀함수의 인자인 값(currN)이 입력 받은 정수(N)와 같을 때까지 1,2,3만큼 증가시킨다. 인자의 값(currN)이 입력받은 정수 N과 같다면 횟수를 1 증가시켜 반환한다. currN이 N보다 크다면 0을 반환한다. 2. dp를 사용한다. 점화식은 f(1) = 1, f(2) = 2, f(3) = 4, 이후는 f(n) = f(n-1) + f(n-2) + f(n-3)이다. 코드 재귀 더보기 #include #include using namespace std; int Func(int N,int currN, int iCount) { if (N < currN) return 0; if (currN == N) return iCount+1; return Func(N, cur..
[백준] C++ 1463번 : 1로 만들기 풀이과정 재귀 함수를 사용해서 N%3==0, N%2==0 외에도 N-1 %3 ==0 , N-1 %2 ==0 , N-2 %3 ==0 의 경우도 고려하여 재귀함수를 작성한다. 코드 재귀 더보기 #include using namespace std; int iCount = 0; void Func(int N, int count) { if (iCount != 0 && count > iCount) return; if (N == 1) { if (iCount == 0) iCount = count; if (iCount > count) iCount = count; } else { if (N % 3 == 0) Func(N/3, count+1); if (N % 2 == 0) Func(N/2, count+1); if (((N -..