🔺 문제
1309번: 동물원
첫째 줄에 우리의 크기 N(1≤N≤100,000)이 주어진다.
www.acmicpc.net
🔺 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
import java.util.*;
import java.io.*;
public class Main {
static final int MOD = 9901;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
// dp[i][j] : i번째 줄 j번째 칸에 동물을 놓을 수 있는 경우의 수
long[][] dp = new long[N + 1][3];
Arrays.fill(dp[1], 1);
for(int i = 2 ; i <= N ; i++) {
dp[i][0] = (dp[i-1][0] + dp[i-1][1] + dp[i-1][2]) % MOD; // j = 0 : 동물 없음
dp[i][1] = (dp[i-1][0] + dp[i-1][2]) % MOD; // j = 1 : 왼쪽 칸에 동물 있음
dp[i][2] = (dp[i-1][0] + dp[i-1][1]) % MOD; // j = 2 : 오른쪽 칸에 동물 있음
}
long ans = (dp[N][0] + dp[N][1] + dp[N][2]) % MOD;
System.out.println(ans);
}
}
|
cs |
✅ 해결 아이디어
✔ DP
●dp[i][j]
: i번째 줄 j번째 칸에 동물을 놓을 수 있는 경우의 수
• dp[i][0] = dp[i-1][0] + dp[i-1][1] + dp[i-1][2]
: 이번 방에는 동물을 넣지 않으므로, 이전 방에서 동물이 어디 들어있든 OK
• dp[i][1] = dp[i-1][0] + dp[i-1][2]
: 이번 행의 왼쪽에 있는 경우, 이전 방에는 오른쪽에 들어있거나 없는 경우만 가능
• dp[i][2] = dp[i-1][0] + dp[i-1][1]
: 이번 행의 오른쪽에 있는 경우, 이전 방에는 왼쪽에 들어있거나 없는 경우만 가능
🔺 다른 풀이들
- 다들 비슷하심
💬 느낀 점
2차원 배열 사용해야하는 건 알았는데.....
DP 식을 구하지 못 했다고 합니다,,,,,하하하ㅏ
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V |
(참고)
[BOJ] 백준 1309번 : 동물원 (JAVA)
문제 어떤 동물원에 가로로 두칸 세로로 N칸인 아래와 같은 우리가 있다. 이 동물원에는 사자들이 살고 있는데 사자들을 우리에 가둘 때, 가로로도 세로로도 붙어 있게 배치할 수는 없다. 이 동
steady-coding.tistory.com
[백준 - 1309번] 동물원 - 자바(JAVA) 정리 및 해설
이번에 풀어볼 문제는 DP문제인 동물원입니다. 1309번: 동물원 첫째 줄에 우리의 크기 N(1≤N≤100,000)이 주어진다. www.acmicpc.net 이문제는 오르막수와 비슷한 문제 양상을 띄고 있어서, 비슷한 문제
sundries-in-myidea.tistory.com
[알고리즘] - 백준 1309번 : 동물원 (JAVA)
문제 풀러가기동적 계획법을 적용해 나갈 배열을 어떤 식으로 구성할 지가 이 문제의 핵심입니다.저는 이차원 배열의 형태를 생각하였고, dpn은 사자가 n행에 어느 곳에서도 위치하지 않을 때dpn
velog.io
'코테 > 백준' 카테고리의 다른 글
[백준/JAVA] 2529번: 부등호 (0) | 2023.08.31 |
---|---|
[백준/JAVA] 11057번: 오르막 수 (0) | 2023.08.30 |
[백준/JAVA] 11931번: 수 정렬하기 4 (0) | 2023.08.29 |
[백준/JAVA] 10974번: 모든 순열 (0) | 2023.08.27 |
[백준/JAVA] 6603번: 로또 (0) | 2023.08.26 |