[문제 링크]

 

2096번: 내려가기

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

www.acmicpc.net


필자는 처음 풀 때 배열 크기를 arr[100000][3]으로 잡고 풀었는데, 메모리초과를 받았다.

다른 사람의 코드를 찾아봤는데 이유는 모르겠지만 배열 크기를 arr[100000][3] 으로 잡고도 정답을 받은 사람들이 많이 있었다.

분명 코드가 똑같은데 메모리초과를 받길래 계속 고민해봤지만 해답을 찾을 수 없었다. 아마도 입출력부분에서 메모리차이가 났던거 같다.

그러던중 N이 최대 100000이라고 해서 배열 크기를 100000으로 잡을 필요가 없다라는 힌트를 보고 정답을 받을 수 있었다. 문제 출제자의 출제 의도도 이쪽에 더 가깝다고 생각한다.


#include <iostream>
using namespace std;

int memoMin[3];
int memoMax[3];

int max(int a, int b) { return a > b ? a : b; }
int min(int a, int b) { return a < b ? a : b; }

int main(void)
{
	int N;
	cin >> N;

	for (int i = 0; i < N; i++)
	{
		int a, b, c;
		cin >> a >> b >> c;
		if (i == 0)
		{
			memoMin[0] = memoMax[0] = a;
			memoMin[1] = memoMax[1] = b;
			memoMin[2] = memoMax[2] = c;
		}
		else
		{
			int tempA, tempB, tempC;

			tempA = memoMin[0], tempB = memoMin[1], tempC = memoMin[2];

			memoMin[0] = min(tempA, tempB) + a;
			memoMin[1] = min(tempA, min(tempB, tempC)) + b;
			memoMin[2] = min(tempB, tempC) + c;

			tempA = memoMax[0], tempB = memoMax[1], tempC = memoMax[2];

			memoMax[0] = max(tempA, tempB) + a;
			memoMax[1] = max(tempA, max(tempB, tempC)) + b;
			memoMax[2] = max(tempB, tempC) + c;



		}
	}

	int minVal = min(memoMin[0], min(memoMin[1], memoMin[2]));
	int maxVal = max(memoMax[0], max(memoMax[1], memoMax[2]));

	cout << maxVal << ' ' << minVal << endl;

	return 0;
}

알고리즘 200일 프로젝트 - 94 day

'알고리즘 > BOJ' 카테고리의 다른 글

백준 9252번: LCS 2  (0) 2020.07.12
백준 10942번: 팰린드롬?  (0) 2020.07.09
백준 11066번: 파일 합치기  (0) 2020.07.08
백준 1915번: 가장 큰 정사각형  (0) 2020.07.06
백준 1965번: 상자넣기  (0) 2020.07.06

+ Recent posts