반응형
https://www.acmicpc.net/problem/10844
10844번: 쉬운 계단 수
첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.
www.acmicpc.net
안 쉬운 계단 수..
앞자리가 아닌 뒷자리부터 생각해야 한다.
뒷자리가 0, 9일 경우엔 계단 수가 한 개만 가능하다. (10, 98)
헷갈려서 가독성 좋게 변수에 담아 풀었었다.
#include <iostream> // 실패코드
#include <string>
#include <vector>
#include <algorithm>
#include <deque>
#include <unordered_set>
#include <cstring>
using namespace std;
int dp[101][10];
int main()
{
ios::sync_with_stdio(0),cin.tie(0);
int N;
cin >> N;
for (int i = 1; i < 10; i++)
dp[1][i] = 1;
for (int i = 2; i <= N; i++) {
for (int j = 0; j < 10; j++) {
int prev_up = dp[i - 1][j + 1]; // 9일때 일단 참조돼서 seg뜸
int prev_down = dp[i - 1][j - 1];
if (j == 0)
dp[i][0] = prev_up;
else if (j == 9)
dp[i][9] = prev_down;
else
dp[i][j] = prev_up + prev_down;
dp[i][j] %= 1000000000;
}
}
int res = 0;
for (int i = 0; i < 10; i++) {
res += dp[N][i];
res %= 1000000000;
}
cout << res;
}
허나 위 경우 변수에 일단 다 담기 때문에 0,9일 경우에도 잘못된 인덱스를 참조해서 segment fault가 떴다.
조심;;
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <deque>
#include <unordered_set>
#include <cstring>
using namespace std;
int dp[101][10];
int main()
{
ios::sync_with_stdio(0),cin.tie(0);
int N;
cin >> N;
for (int i = 1; i < 10; i++)
dp[1][i] = 1;
for (int i = 2; i <= N; i++) {
for (int j = 0; j < 10; j++) {
if (j == 0)
dp[i][0] = dp[i - 1][j + 1];
else if (j == 9)
dp[i][9] = dp[i - 1][j - 1];
else
dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j + 1];
dp[i][j] %= 1000000000;
}
}
int res = 0;
for (int i = 0; i < 10; i++) {
res += dp[N][i];
res %= 1000000000;
}
cout << res;
}
반응형
'<algorithm> > 백준' 카테고리의 다른 글
백준 19583 싸이버개강총회 c++ (0) | 2023.11.28 |
---|---|
백준 9009 피보나치 c++ (0) | 2023.11.22 |
백준 3184 양 c++ (0) | 2023.11.05 |
백준 1806 부분합 c++ (0) | 2023.11.04 |
백준 2230 수 고르기 c++ (0) | 2023.11.04 |