c c++ 언어 공부
백준 9625번 : BABBA (C 언어)
Code C
2023. 6. 11. 01:42
https://www.acmicpc.net/problem/9625
9625번: BABBA
상근이는 길을 걷다가 신기한 기계를 발견했다. 기계는 매우 매우 큰 화면과 버튼 하나로 이루어져 있다. 기계를 발견했을 때, 화면에는 A만 표시되어져 있었다. 버튼을 누르니 글자가 B로 변했
www.acmicpc.net
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#include <stdio.h>
int main() {
//0 1 1 2 3 5
//1 0 1 1 2 3
int dpA[10001] = { 0, };
int dpB[10001] = { 0, };
dpA[0] = 1;
dpB[0] = 0;
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
dpA[i] = dpB[i - 1];
dpB[i] = dpB[i - 1] + dpA[i - 1];
}
printf("%d %d", dpA[n], dpB[n]);
return 0;
}
|
cs |
문제풀이:
1. 문제 설명
상근이가 발견한 신기한 기계는 화면에 표시된 'A'를 'B'로, 'B'를 'BA'로 변환하는 기능을 가지고 있습니다. 이 변환은 기계의 버튼을 누를 때마다 실행됩니다. 우리의 목표는 버튼을 K번 눌렀을 때 화면에 표시되는 'A'와 'B'의 개수를 찾는 것입니다.
2. 코드 설명
이 문제를 해결하기 위해 동적 프로그래밍을 사용했습니다. 각 문자의 개수는 이전 단계의 문자 개수에 의존하므로, 이전 단계의 결과를 저장하면서 답을 찾아갑니다.
- 먼저 'A'와 'B'의 개수를 저장할 두 개의 배열 dpA와 dpB를 초기화합니다. 초기 상태에서는 'A'가 하나 있고 'B'는 없으므로, dpA[0]는 1로, dpB[0]은 0으로 설정합니다.
- 그리고 사용자로부터 정수 n을 입력 받습니다. 이 n은 버튼을 누를 횟수입니다.
- 그 후 for문을 이용하여 1부터 n까지 반복합니다:
- dpA[i]는 이전 dpB 값, 즉 dpB[i-1]를 저장합니다. 이는 기계가 'B'를 'BA'로 변환하므로, 이전 단계에서 'B'의 개수가 현재 단계에서 'A'의 개수가 됩니다.
- dpB[i]는 이전 dpB 값과 이전 dpA 값을 더한 것을 저장합니다. 이는 기계가 'A'를 'B'로, 'B'를 'BA'로 변환하므로, 이전 단계에서 'A'와 'B'의 개수가 합쳐져 현재 단계에서 'B'의 개수가 됩니다.
- 마지막으로, dpA[n]과 dpB[n]을 출력합니다. 이 값들은 각각 버튼을 n번 누른 후 'A'와 'B'의 개수를 나타냅니다.