2 분 소요

1. 문제

https://www.acmicpc.net/problem/12849

  • DP 문제
// 문제
숭실 대학교 정보 과학관은 캠퍼스의  건너편으로 유배를 당했다.
그래서 컴퓨터 학부 학생들은 캠퍼스를 본대 라고 부르고
정보 과학관을 정보대 라고 부른다.
준영이 또한 컴퓨터 학부 소속 학생이라서
정보 과학관에 박혀있으며 항상 본대를 가고 싶어 한다.
어느  준영이는 본대를 산책하기로 결심하였다. 숭실 대학교 캠퍼스 지도는 아래와 같다.

(편의  문제에서는  건물만 등장한다고 가정하자)

 건물에서 바로 인접한 다른 건물로 이동 하는  1분이 걸린다.
준영이는 산책 도중에 한번도 길이나 건물에 멈춰서 머무르지 않는다.
준영이는  일이 많아서  D분만 산책을  것이다.
(산책을 시작   D분  , 정보 과학관에 도착해야 한다.)
이때 가능한 경로의 경우의 수를 구해주자.

// 입력
D  주어진다 (1  D  100,000)

// 출력
가능한 경로의 수를 1,000,000,007 나눈 나머지를 출력 한다.

// 예제 입력 1
10

// 예제 출력 1
9857


2. 핵심 아이디어

  • DP로 구현


3. Python 문제풀이

import sys
input = sys.stdin.readline

# 0 분에 어떤 지점에 도착할 수 있는 상태
# 0 : 정보과학관
# 1 : 전산관
# 2 : 미래관
# 3 : 신양관
# 4 : 한경직
# 5 : 진리관
# 6 : 학생회관
# 7 : 형남 공학관
dp = [1, 0, 0, 0, 0, 0, 0, 0]

def nxt(state) :
  tmp = [0 for _ in range(8)]
  tmp[0] = state[1] + state[2]
  tmp[1] = state[0] + state[2] + state[3]
  tmp[2] = state[0] + state[1] + state[3] + state[4]
  tmp[3] = state[1] + state[2] + state[4] + state[5]
  tmp[4] = state[2] + state[3] + state[5] + state[7]
  tmp[5] = state[3] + state[4] + state[6]
  tmp[6] = state[5] + state[7]
  tmp[7] = state[4] + state[6]
  for i in range(8) :
    tmp[i] %= 1000000007
  return tmp

for i in range(int(input())) :
  dp = nxt(dp)

print(dp[0])


4. Java 문제풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	static final long div = 1_000_000_007;

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		int n = Integer.parseInt(br.readLine());
		long[][] dp = new long[n + 1][8];
		dp[0][0] = 1;

		for (int i=0; i<n; i++) {
			dp[i+1][0] = dp[i][1] + dp[i][2];
			dp[i+1][1] = dp[i][0] + dp[i][2] + dp[i][3];
			dp[i+1][2] = dp[i][0] + dp[i][1] + dp[i][3] + dp[i][5];
			dp[i+1][3] = dp[i][1] + dp[i][2] + dp[i][4] + dp[i][5];
			dp[i+1][4] = dp[i][3] + dp[i][5] + dp[i][6];
			dp[i+1][5] = dp[i][2] + dp[i][3] + dp[i][4] + dp[i][7];
			dp[i+1][6] = dp[i][4] + dp[i][7];
			dp[i+1][7] = dp[i][5] + dp[i][6];
      for (int j=0; j<8; j++) {
        dp[i+1][j] %= div;
      }
		}

		System.out.println(dp[n][0]);
	}
}

댓글남기기