-
[백준] 22236: 🛫🛬가희와 비행기 - JAVA문제풀이/백준 2021. 8. 18. 16:10
[백준] 22236: 가희와 비행기
22236번: 가희와 비행기
가희는 김포 공항에서 김해 공항까지 비행기를 타고 가려고 합니다. 비행기가 수평 방향으로 1만큼 이동하였을 때, 비행기의 고도는 1만큼 변화합니다. (상승 또는 하강) 비행기가 상승하거나
www.acmicpc.net
풀이
🪑 DP유형 스러운 DP문제로 어렵지 않은 점화식으로 풀 수 있는 문제였다!
📝 문제를 정리해 보자!
- 수평 방향으로의 이동 변화량과 고도 변화량은 동일하다.
- 비행기는 착륙까지 비행 방향을 바꾸지 않는다. 즉, 고도만 바뀐다.
- 수평 방향으로 D만큼 이동했을 때 착륙 지점의 고도는 항상 0이다. 또한 착륙 이전에는 고도가 0이면 안된다.
- 위의 조건을 모두 만족하여 착륙지점에 착륙하는 경우의 수를 모두 구한다.
🙋♀️ 일단 점화식을 구해보자!
- 현재 이동 거리가 i이고, 현재 고도가 j라고 했을때 현재 까지 이동할 수 있는 경우의 수를 구하는 식은 아래와 같다.
- dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j + 1]
- 현재 위치에서의 이동 경우의 수는 이전 위치에서 고도가 하나 낮을때의 경우의수 + 고도가 하나 높을 때의 경우의 수이다.
- 이동 거리 변화량과 고도 변화량은 동일하므로 1칸 이동시 1칸만큼 낮아지거나, 높아질 수 밖에 없기 때문이다!
🔧 문제를 따라가며 풀어보자!
- 점화식을 사용하여 bottom-up 방식으로 순회해 주었다.
- 도착지 이전 까지의 경우의 수만 구하고, 도착 했을 때는 무조건 고도가 0이므로 이전 위치에서 고도가 1일때의 경우의 수가 정답이 된다.
🔹 도착 했을 때는 무조건 고도가 0이므로 이전 위치에서 고도가 1일때의 경우의 수가 정답이 된다.
- 식으로 표현하면 다음과 같다.
- dp[d - 1][1] % m
코드
12345678910111213141516171819202122232425//22236: 가희와 비행기import java.io.*;import java.util.*;public class Main {public static void main(String[] args) throws IOException {//입력BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));String str = bf.readLine();StringTokenizer st = new StringTokenizer(str);int d = Integer.parseInt(st.nextToken());long m = Long.parseLong(st.nextToken());//입력 끝long[][] dp = new long[4001][4001];dp[1][1] = 1;for(int i = 2; i < d; i++) {for(int j = 0; j <= i; j++) {if(j == 0) continue;else dp[i][j] += (dp[i - 1][j - 1] + dp[i - 1][j + 1] % m);}}System.out.println(dp[d - 1][1] % m);}}cs '문제풀이 > 백준' 카테고리의 다른 글
[백준]12896: 스크루지 민호 - JAVA (0) 2021.08.23 [백준]22238: 🔫가희와 btd5 - JAVA (1) 2021.08.20 [백준]22234: 💰가희와 은행 - JAVA (1) 2021.08.16 [백준]1944: 복제 로봇 - JAVA (0) 2021.08.14 [백준]1194: 달이 차오른다, 가자 - JAVA (0) 2021.08.13