※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 2096번 문제인 내려가기이다.
문제는 아래 링크를 확인하자.

www.acmicpc.net/problem/2096

 

2096번: 내려가기

첫째 줄에 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 숫자가 세 개씩 주어진다. 숫자는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 중의 하나가 된다.

www.acmicpc.net

이 문제는 단순한 DP문제이다. 단, 메모리제한이 4MB이므로 모든 input을 한번에 받고 계산해나가는 것은 이 문제에서는 불가능하다.

따라서, 이미 이전에 사용하고 필요없어진 값은 저장하지 않는 방식으로 다음과 같이 구현했다.

 

0) 1번째 줄만 읽었을 때, 1, 2, 3열의 수로 각각 끝나는 최솟값과 최솟값은 둘 다 각 열에 들어온 숫자와 같다.

이 값으로 배열을 초기화한다.

1) i(>=1)번째 줄까지의 1, 2, 3열의 수로 각각 끝날 최솟값과 최댓값을 저장할 배열이 있을 때, 값 3개를 읽어와 i+1번째 줄까지의 1, 2, 3열의 수로 각각 끝날 최솟값과 최댓값을 갱신한다. 이를 N번째 줄까지의 결과를 얻을 때까지 반복한다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <cmath>
using std::cin;
using std::cout;
using std::min;
using std::max;

int nums[3][2]; //두번째 성분이 0이면 이 칸으로 도착하는 최솟값, 1이면 최댓값을 저장해나간다

int main()
{
    int N; cin >> N;
    int x, y, z; cin >> x >> y >> z;
    nums[0][0] = x, nums[0][1] = x;
    nums[1][0] = y, nums[1][1] = y;
    nums[2][0] = z, nums[2][1] = z;

    for (int i = 1;i < N;i++) {
        int a, b, c; cin >> a >> b >> c;
        int temp00 = min(nums[0][0], nums[1][0]) + a;
        int temp01 = max(nums[0][1], nums[1][1]) + a;
        int temp10 = min(nums[0][0], min(nums[1][0], nums[2][0])) + b;
        int temp11 = max(nums[0][1], max(nums[1][1], nums[2][1])) + b;
        int temp20 = min(nums[1][0], nums[2][0]) + c;
        int temp21 = max(nums[1][1], nums[2][1]) + c;
        nums[0][0] = temp00; nums[0][1] = temp01;
        nums[1][0] = temp10; nums[1][1] = temp11;
        nums[2][0] = temp20; nums[2][1] = temp21;
    }
    cout << max(nums[0][1], max(nums[1][1], nums[2][1])) << ' ' << min(nums[0][0], min(nums[1][0], nums[2][0]));
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 1504 // C++] 특정한 최단경로  (0) 2021.02.23
[BOJ 1238 // C++] 파티  (0) 2021.02.22
[BOJ 15685 // C++] 드래곤 커브  (0) 2021.02.20
[BOJ 14888 // C++] 연산자 끼워넣기  (0) 2021.02.19
[BOJ 17069 // C++] 파이프 옮기기 2  (0) 2021.02.18

+ Recent posts