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

 

이번에 볼 문제는 백준 5546번 문제인 파스타이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/5546 

 

5546번: 파스타

상근이는 매일 저녁으로 파스타를 만들어 먹는다. 상근이가 만들 수 있는 파스타는 총 세 종류로 토마토 소스, 크림 소스, 바질 소스이다. 상근이는 앞으로 N일 동안 먹을 파스타를 계획하려고

www.acmicpc.net

i일까지 파스타를 먹었을 때 가능한 상태는 다음의 여섯가지이다:

 

1~3. 이틀 연속 토마토 소스/크림 소스/바질 소스 파스타를 먹은 상태

4~6. 어제와 다르게 오늘은 토마토 소스/크림 소스/바질 소스 파스타를 먹은 상태

 

각 날의 위 여섯가지 상태의 경우의 수를 점화식으로 잘 관리해나가면 문제를 쉽게 해결할 수 있다.

 

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

#include <iostream>
using namespace std;

int plan[101];
int A[101]; // 토마토
int AA[101]; // 토마토토마토
int B[101]; // 크림
int BB[101]; // 크림크림
int C[101]; // 바질
int CC[101]; // 바질바질

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	int N, K; cin >> N >> K;
	while (K--) {
		int x, y; cin >> x >> y;
		plan[x] = y;
	}

	if (plan[1] == 1) A[1] = 1;
	else if (plan[1] == 2) B[1] = 1;
	else if (plan[1] == 3) C[1] = 1;
	else A[1] = B[1] = C[1] = 1;

	for (int i = 2; i <= N; i++) {
		if (plan[i] == 1) {
			A[i] = (B[i - 1] + BB[i - 1] + C[i - 1] + CC[i - 1]) % 10000;
			AA[i] = A[i - 1];
		}
		else if (plan[i] == 2) {
			B[i] = (A[i - 1] + AA[i - 1] + C[i - 1] + CC[i - 1]) % 10000;
			BB[i] = B[i - 1];
		}
		else if (plan[i] == 3) {
			C[i] = (A[i - 1] + AA[i - 1] + B[i - 1] + BB[i - 1]) % 10000;
			CC[i] = C[i - 1];
		}
		else {
			A[i] = (B[i - 1] + BB[i - 1] + C[i - 1] + CC[i - 1]) % 10000;
			AA[i] = A[i - 1];
			B[i] = (A[i - 1] + AA[i - 1] + C[i - 1] + CC[i - 1]) % 10000;
			BB[i] = B[i - 1];
			C[i] = (A[i - 1] + AA[i - 1] + B[i - 1] + BB[i - 1]) % 10000;
			CC[i] = C[i - 1];
		}
	}

	cout << (A[N] + AA[N] + B[N] + BB[N] + C[N] + CC[N]) % 10000;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 5545 // C++] 최고의 피자  (0) 2022.06.05
[BOJ 18511 // C++] 큰 수 구성하기  (0) 2022.06.05
[BOJ 24929 // C++] Number Colosseum  (0) 2022.06.05
[BOJ 11400 // C++] 단절선  (0) 2022.06.04
[BOJ 4352 // C++] Jogging Trails  (0) 2022.06.03

+ Recent posts