https://www.acmicpc.net/problem/12849
매우 상징성이 강한 문제다. 내가 그동안 왜 안나오나... 하고 생각했던 그런문제다. 문제가 조건을 명확하게 주지 않은 면이 있는데, 출발점도 정보관이고 도착점도 정보관으로 놓고 푸는 문제다.
문제에서 묻는것은 출발점에서 시작해 D분이 지났을때 다시 출발점으로 돌아올수 있는 경로의 수이다. 이렇게 총 경로의 수를 구할때 Dynamic programming으로 해결할 수 있음을 유의하자!
정석은 2차원배열을 이용하는 것이지만 배열을 하나더 추가로 두는 조건으로 1차원 배열 2개로도 해결이 가능하다. 두 풀이 모두 소개한다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
/*
정보과학 0
전산 1
미래 2
신양 3
한경직 4
진리5
형남 6
학생회 7
*/
public static void solution(int d) {
long[][]dp=new long[d+1][8];
dp[0][0]= 1;
for(int i=1;i<=d;++i) {
dp[i][0] = dp[i - 1][1] + dp[i - 1][2];
dp[i][1] = dp[i - 1][0] + dp[i - 1][2] + dp[i - 1][3];
dp[i][2] = dp[i - 1][0] + dp[i - 1][1] + dp[i - 1][3] + dp[i - 1][4];
dp[i][3] = dp[i - 1][1] + dp[i - 1][2] + dp[i - 1][4] + dp[i - 1][5];
dp[i][4] = dp[i - 1][2] + dp[i - 1][3] + dp[i - 1][5] + dp[i - 1][6];
dp[i][5] = dp[i - 1][3] + dp[i - 1][4] + dp[i - 1][7];
dp[i][6] = dp[i - 1][4] + dp[i - 1][7];
dp[i][7] = dp[i - 1][5] + dp[i - 1][6];
for (int j = 0; j < 8; ++j)
dp[i][j] %= 1000000007;
}
System.out.println(dp[d][0]);
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int d = Integer.parseInt(br.readLine());
solution(d);
}
}
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
/*
정보과학 0
전산 1
미래 2
신양 3
한경직 4
진리5
형남 6
학생회 7
*/
public static void solution(int d) {
long[] dp = {1, 0, 0, 0, 0, 0, 0, 0};
for (int i = 0; i < d; ++i) {
long[]result=new long[8];
result[0]=dp[1]+dp[2];
result[1]=dp[0]+dp[2]+dp[3];
result[2]=dp[0]+dp[1]+dp[3]+dp[4];
result[3]=dp[1]+dp[2]+dp[4]+dp[5];
result[4]=dp[2]+dp[3]+dp[5]+dp[6];
result[5]=dp[3]+dp[4]+dp[7];
result[6]=dp[4]+dp[7];
result[7]=dp[5]+dp[6];
for(int j=0;j<8;++j)
result[j]%=1000000007;
dp=result;
}
System.out.println(dp[0]);
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int d = Integer.parseInt(br.readLine());
solution(d);
}
}
'알고리즘 > DP(Dynamic programming, 동적프로그래밍)' 카테고리의 다른 글
백준(BOJ) 2407: 조합 (0) | 2024.01.14 |
---|---|
백준(BOJ) 2655: 가장높은 탑쌓기 (1) | 2023.12.31 |
백준(BOJ) 1932: 정수 삼각형 (1) | 2023.12.31 |
백준(BOJ) 1495: 기타리스트 (0) | 2023.12.30 |
백준(BOJ) 2579: 계단 오르기 (1) | 2023.12.30 |