#10844 - 쉬운 계단 수 (부제: 분명히 맞게 풀었는데...)
문제
45656이란 수를 보자.
이 수는 인접한 모든 자리수의 차이가 1이 난다. 이런 수를 계단 수라고 한다.
세준이는 수의 길이가 N인 계단 수가 몇 개 있는지 궁금해졌다.
N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구하는 프로그램을 작성하시오. (0으로 시작하는 수는 없다.)
입력
첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 100보다 작거나 같은 자연수이다.
출력
첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.
예시 입력 / 출력
예시 입력 | 예시 출력 |
1 | 9 |
2 | 17 |
3 | 32 |
4 | 61 |
풀이
#include <iostream>
#define mod 1000000000
using namespace std;
// DP[N][L] : 길이 N, 마지막 숫자 L일 경우의 수
int DP[101][10];
int result = 0;
int solution(int n) {
// 한 자리 숫자
for (int i = 0; i < 10; i++) {
DP[1][i] = 1;
}
// 2자리 이상의 숫자
for (int i = 2; i <= n; i++) {
for (int j = 0; j <= 9; j++)
if (j == 0)
DP[i][0] = DP[i - 1][1]; // 끝자리 0으로 끝나는 경우
else if (j == 9)
DP[i][9] = DP[i - 1][8]; // 끝자리 9로 끝나는 경우
else
DP[i][j] = (DP[i - 1][j - 1] + DP[i - 1][j + 1]) % mod;
}
for (int i = 1; i < 10; i++)
result = (result + DP[n][i]) % mod;
return result;
}
int main() {
int n;
cin >> n;
cout << solution(n);
return 0;
}
^ 설명 참고함
백준 10844번 쉬운 계단 수 :: 마이구미
이 글은 백준 알고리즘 문제 10844번 "쉬운 계단 수" 를 풀이한다. 풀이 방법으로는 동적계획법으로 설명한다. 문제 링크 - https://www.acmicpc.net/problem/10844 45656이란 수를 보자. 이 수는 인접한 모든 ��
mygumi.tistory.com
^ 코드 참고
[백준][10844번][DP] 쉬운 계단 수
쉬운 계단 수 https://www.acmicpc.net/problem/10844 <코드> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #include #define mod 1000000000 int main(void){ int N; int..
wootool.tistory.com
www.acmicpc.net/board/view/16115
^ %mod 나눠주는 목적 이해함
글 읽기 - 정답인데 왜 정답인지 모르겠습니다.
댓글을 작성하려면 로그인해야 합니다.
www.acmicpc.net
피드백
나는 분명분명 코드를 맞게 짰는데 왜 틀렸다고 할까? 백준이 채점을 잘못할 수도 있는 건가? 왜 런타임에러가 아니라 틀렸다고 뜨지.. 뭐지뭐지... 를 하루종일 반복하다가 겨우 오류를 잡았다.
www.acmicpc.net/board/view/16115
글 읽기 - 정답인데 왜 정답인지 모르겠습니다.
댓글을 작성하려면 로그인해야 합니다.
www.acmicpc.net
요약) int를 사용했기 때문에 오버플로우가 생길 수 있는 부분에는 반드시 %mod를 해줘야 한다.
#include <iostream>
using namespace std;
int DP[101][10];
int result = 0;
int solution(int n) {
for (int i = 0; i < 10; i++) {
DP[1][i] = 1;
}
for (int i = 2; i <= n; i++) {
for (int j = 0; j <= 9; j++)
if (j == 0)
DP[i][0] = DP[i - 1][1] % 1000000000;
else if (j == 9)
DP[i][9] = DP[i - 1][8] % 1000000000;
else
DP[i][j] = (DP[i - 1][j - 1] + DP[i - 1][j + 1]) % 1000000000;
}
for (int i = 1; i < 10; i++)
result += DP[n][i] % 1000000000;
return result;
}
int main() {
int n;
cin >> n;
cout << solution(n);
return 0;
}
^ 틀린 코드
%mod 개념을 파악하지 못하고 그냥 되는대로 다 갖다붙였다..
다시 보니 틀린 게 당연하지만 문제 풀면서 억울하고 답답해서 눈물 고였음 ㅋㅋㅋ
<오답노트>
result += DP % mod
나의 예상: result와 DP를 더한 걸 mod로 나눠준다
실제 계산: DP % mod 해준 걸 result에 더한다
따라서, result = (result + DP) % mod 로 수정해야 함
'BOJ Algorithm > Dynamic Programming' 카테고리의 다른 글
#11057 - 오르막 수 (0) | 2020.10.18 |
---|---|
#9095 - 1, 2, 3 더하기 (0) | 2020.10.07 |
#11727 - 2×n 타일링 2 (0) | 2020.10.07 |
#11726 - 2×n 타일링 (0) | 2020.10.07 |
#1463 - 1로 만들기 (0) | 2020.10.05 |