728x90

문제 링크
https://www.acmicpc.net/problem/20500
문제
욱제는 15라는 수를 굉장히 싫어한다. 그래서 0으로 시작하지 않고 1과 5로만 구성된 자리 양의 정수 중에서, 15의 배수가 몇 개인지 궁금해졌다.
참가자 여러분도 궁금하지요?
안 궁금함? 15ㄱ
입력
N 이 주어진다.
출력
문제의 답을 1000000007로 나눈 나머지를 출력한다.
해결 코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
/*
*
* 15배수 만들기
*
* 1) 각 자리 합이 3의 배수일 것
* 2) 끝 자리가 5일 것
*
* 해당 조건에 맞는 경우의 수는 아래와 같다.
*
* 1)111과 15배수의 조합
* 111의 순서를 바꿔도 값은 그대로 이므로 1개의 경우의 수가 추가된다.
* 2)555와 15배수의 조합
* 555의 순서를 바꿔도 값은 그대로 이므로 1개의 경우의 수가 추가된다.
* 3)15와 15배수의 조합
* 15
* 1515
* 151515
* 511515
* 115515
* 5115
* 155115
* 515115
* 551115
* 1155
* 151155
* 511155
* 115155
*
* 규칙에 따라 3배씩 늘어난다.
*
* => dp[n] = dp[n-2]*3 + dp[n-3]*2
*
* */
public class Main {
static int MOD = 1_000_000_007;
static int INF = -1;
static long[] dp;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
dp = new long[1516];
Arrays.fill(dp,-1);
//초기값 설정
dp[0] = 0;
dp[1] = 0;
dp[2] = 1;
dp[3] = 1;
System.out.println(getCount(N));
}
public static long getCount(int n){
if(dp[n] != INF){
return dp[n] % MOD;
}
dp[n] = ((getCount(n-2)*3) % MOD + (getCount(n-3)*2) % MOD)%MOD;
return dp[n];
}
}
실행 결과

팁
- 모르겠으면 3번정도 직접 그려서 규칙을 찾자
'알고리즘 문제 풀이 > 해결코드' 카테고리의 다른 글
[백준 - 16194][Silver 1][해설 X] - 카드 구매하기 2 (JAVA) (0) | 2024.04.21 |
---|---|
[백준 - 11062][Gold 3][해설 X] - 카드 게임 (JAVA) (0) | 2024.04.12 |
[백준 - 4811][Gold 5][해설 X] - 알약 (JAVA) (0) | 2024.04.10 |
[백준 - 2240][Gold 5][해설 X] - 자두나무 (JAVA) (1) | 2024.04.09 |
[백준 - 1451][Gold 4][해설 X] - 직사각형으로 나누기 (JAVA) (0) | 2024.04.08 |