문제 (https://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 + 슬라이딩 윈도우로 해결한 문제이다. 두 알고리즘 모두 취약해서...ㅎㅎ 다른 코드를 참고하여 풀었다.
크기가 3인 배열들 minArr, maxArr, minTmp, maxTmp을 사용했는데, minTmp, maxTmp는 현재 행 이전까지의 결과를 저장해둔 배열이다.
- 첫 번째 행의 값들은 최솟값이자 최댓값이므로 4개의 배열에 모두 삽입해준다.
- 첫 번째 행이 아닐 경우에는 minTmp, maxTmp에 저장되어있는 이전 행까지의 결과를 사용하여 minArr, maxArr에 현재 행까지의 계산 결과를 저장한다.
- 다음 행으로 넘어가기 전에 minArr, maxArr에 존재하는 값들을 minTmp, maxTmp에 동일하게 넣어준다. (다음 행에서 현재 행까지의 결과를 사용할 수 있도록!)
- n번 반복이 끝나면 max_element와 min_element로 maxArr 배열의 최댓값과 minArr 배열의 최솟값을 출력했다.
[소스코드]
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
BOJ 2096번: 내려가기 | |
DATE: 2022-01-17 | |
*/ | |
#include <iostream> | |
#include <algorithm> | |
using namespace std; | |
int main(){ | |
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); | |
int n, num; | |
cin >> n; | |
int minArr[3], maxArr[3], minTmp[3], maxTmp[3]; | |
int input[3]; | |
for(int i = 0 ; i < n ; i++){ | |
cin >> input[0] >> input[1] >> input[2]; | |
if(i == 0) { | |
for(int j = 0 ; j < 3 ; j++) minTmp[j] = maxTmp[j] = minArr[j] = maxArr[j] = input[j]; | |
continue; | |
} | |
minArr[0] = input[0] + min(minTmp[0], minTmp[1]); | |
maxArr[0] = input[0] + max(maxTmp[0], maxTmp[1]); | |
minArr[1] = input[1] + min({minTmp[0], minTmp[1], minTmp[2]}); | |
maxArr[1] = input[1] + max({maxTmp[0], maxTmp[1], maxTmp[2]}); | |
minArr[2] = input[2] + min(minTmp[1], minTmp[2]); | |
maxArr[2] = input[2] + max(maxTmp[1], maxTmp[2]); | |
for(int j = 0 ; j < 3 ; j++){ | |
minTmp[j] = minArr[j]; | |
maxTmp[j] = maxArr[j]; | |
} | |
} | |
cout << *max_element(maxArr, maxArr + 3) << " " << *min_element(minArr, minArr + 3); | |
return 0; | |
} |

'ALGORITHM > BOJ' 카테고리의 다른 글
[BOJ] 1253번 좋다 (C++) (0) | 2022.01.19 |
---|---|
[BOJ] 3078번 좋은 친구 (C++) (0) | 2022.01.19 |
[BOJ] 2211번 네트워크 복구 (C++) (0) | 2022.01.17 |
[BOJ] 13549번 숨바꼭질 3 (C++) (0) | 2022.01.17 |
[BOJ] 1238번 파티 (C++) (0) | 2022.01.17 |