백준 22869[자바] java 징검다리 건너기(small)
문제 링크: https://www.acmicpc.net/problem/22869
22869번: 징검다리 건너기 (small)
$N$개의 돌이 일렬로 나열 되어 있다. $N$개의 돌에는 수 $A_{1} A_{2} ... A_{i} ... A_{N}$로 부여되어 있다. 가장 왼쪽에 있는 돌에서 출발하여 가장 오른쪽에 있는 돌로 건너가려고 한다. 항상 오른쪽으
www.acmicpc.net
▶문제
N개의 돌이 일렬로 나열 되어 있다. N개의 돌에는 수 A1A2...Ai...AN로 부여되어 있다. 가장 왼쪽에 있는 돌에서 출발하여 가장 오른쪽에 있는 돌로 건너가려고 한다.
- 항상 오른쪽으로만 이동가능하다.
- i번째 돌에서 (i < j)번째 돌로 이동할 때 (j - i) × (1 + |Ai−Aj|) 만큼 힘을 쓴다.
- 돌을 한번 건너갈 때마다 쓸 수 있는 힘은 최대 K이다.
이때, 가장 왼쪽 돌에서 출발하여 가장 오른쪽에 있는 돌로 건너갈 수 있는지 구해보자.
▶입력
첫 번째 줄에 돌의 개수 N와 쓸 수 있는 최대 힘 K가 공백으로 구분되어 주어진다.
두 번째 줄에는 N개의 돌의 수 Ai가 공백으로 구분되어 주어진다.
▶출력
가장 오른쪽에 있는 돌로 이동할 수 있다면 YES를 출력한다. 만약 이동하지 못하는 경우에는 NO를 출력한다.
▶해설
DP문제 입니다. 마지막 돌에 도달할 수 있는지 없는지 찾는 문제입니다. 조건을 살펴보겠습니다.
1. 최대 힘 보다 큰 힘은 낼 수 없다.
2. 다음 돌로 가는데 필요한 힘-> (앞으로 갈 돌 - 현재 돌)의 인덱스 * (1+ 절댓값(현재돌-다음에갈 돌의 힘)
문제를 풀려면 dfs + 메모리제이션이 필요합니다.
돌의 이동경로를 보겠습니다.
1에서 갈 수 있는 돌이 2, 3, 4라면 2, 3, 4를 다음 들릴 곳으로 설정하고, 앞으로는 들린 곳이므로 앞으로 들릴 필요는 없습니다.
2에서 갈 수 있는 돌이 3, 4라면 1에서 이미 3, 4 를 들렸으므로 실행할 필요없이 종료합니다.
위와 같은 알고리즘으로 현재 돌에서 들릴 수 있는 모든 곳을 식별한 후 다음 돌에서는 들리지 않는 형식으로 진행하면 됩니다.
private static void dfs(int index){ if(index==n){ dp[index]=true; return; } if(dp[index]){ return; } dp[index]=true; for(int i=index+1; i<=n; i++){ if((i-index)*(1+Math.abs(arr[index-1]-arr[i-1]))<=k){ dfs(i); } } }
전체 코드
import java.io.*; import java.util.*; public class Main { static int n,k; static int []arr; static boolean[]dp; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] s1 = br.readLine().split(" "); n = Integer.parseInt(s1[0]); k = Integer.parseInt(s1[1]); arr = new int[n]; String[] s = br.readLine().split(" "); for(int i=0; i<n; i++){ arr[i] = Integer.parseInt(s[i]); } dp = new boolean[n+1]; dfs(1); System.out.println(dp[n]?"YES":"NO"); } private static void dfs(int index){ if(index==n){ dp[index]=true; return; } if(dp[index]){ return; } dp[index]=true; for(int i=index+1; i<=n; i++){ if((i-index)*(1+Math.abs(arr[index-1]-arr[i-1]))<=k){ dfs(i); } } } }

'Alogorithm > DP' 카테고리의 다른 글
백준 3687[자바] java 성냥개비 (0) | 2022.04.16 |
---|---|
백준 14728[자바] java 벼락치기 (0) | 2022.04.15 |
백준 11054[자바] java 가장 긴 바이토닉 부분 수열 (0) | 2022.04.05 |
백준 2629[자바] java 양팔저울 (0) | 2022.03.31 |
백준 21923[자바] java 곡예 비행 (0) | 2022.03.30 |
댓글
이 글 공유하기
다른 글
-
백준 3687[자바] java 성냥개비
백준 3687[자바] java 성냥개비
2022.04.16문제 링크: https://www.acmicpc.net/problem/3687 3687번: 성냥개비 각 테스트 케이스에 대해서 입력으로 주어진 성냥개비를 모두 사용해서 만들 수 있는 가장 작은 수와 가장 큰 수를 출력한다. 두 숫자는 모두 양수이어야 하고, 숫자는 0으로 시작할 수 없다. www.acmicpc.net ▶문제 성냥개비는 숫자를 나타내기에 아주 이상적인 도구이다. 보통 십진수를 성냥개비로 표현하는 방법은 다음과 같다. 성냥개비의 개수가 주어졌을 때, 성냥개비를 모두 사용해서 만들 수 있는 가장 작은 수와 큰 수를 찾는 프로그램을 작성하시오. ▶입력 첫째 줄에 테스트 케이스의 개수가 주어진다. 테스트 케이스는 최대 100개이다. 각 테스트 케이스는 한 줄로 이루어져 있고, 성냥개비의 개수 n이… -
백준 14728[자바] java 벼락치기
백준 14728[자바] java 벼락치기
2022.04.15문제 링크: https://www.acmicpc.net/problem/14728 14728번: 벼락치기 ChAOS(Chung-ang Algorithm Organization and Study) 회장이 되어 일이 많아진 준석이는 시험기간에도 일 때문에 공부를 하지 못하다가 시험 전 날이 되어버리고 말았다. 다행히도 친절하신 교수님께서 아래와 www.acmicpc.net ▶문제 ChAOS(Chung-ang Algorithm Organization and Study) 회장이 되어 일이 많아진 준석이는 시험기간에도 일 때문에 공부를 하지 못하다가 시험 전 날이 되어버리고 말았다. 다행히도 친절하신 교수님께서 아래와 같은 힌트를 시험 전에 공지해 주셨다. 내용은 아래와 같다. 여러 단원을 융합한 문제는 출제하지 … -
백준 11054[자바] java 가장 긴 바이토닉 부분 수열
백준 11054[자바] java 가장 긴 바이토닉 부분 수열
2022.04.05문제 링크: https://www.acmicpc.net/problem/11054 11054번: 가장 긴 바이토닉 부분 수열 첫째 줄에 수열 A의 크기 N이 주어지고, 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ Ai ≤ 1,000) www.acmicpc.net ▶문제 수열 S가 어떤 수 Sk를 기준으로 S1 < S2 < …. Sk-1 < Sk > Sk+1 > …. SN-1 > SN을 만족한다면, 그 수열을 바이토닉 수열이라고 한다. 예를 들어, {10, 20, 30, 25, 20}과 {10, 20, 30, 40}, {50, 40, 25, 10} 은 바이토닉 수열이지만, {1, 2, 3, 2, 1, 2, 3, 2, 1}과 {10, 20, 30, 40, 20,… -
백준 2629[자바] java 양팔저울
백준 2629[자바] java 양팔저울
2022.03.31문제 링크: https://www.acmicpc.net/problem/2629 2629번: 양팔저울 첫째 줄에는 추의 개수가 자연수로 주어진다. 추의 개수는 30 이하이다. 둘째 줄에는 추의 무게들이 자연수로 가벼운 것부터 차례로 주어진다. 같은 무게의 추가 여러 개 있을 수도 있다. 추의 무 www.acmicpc.net ▶문제 양팔 저울과 몇 개의 추가 주어졌을 때, 이를 이용하여 입력으로 주어진 구슬의 무게를 확인할 수 있는지를 결정하려고 한다. 무게가 각각 1g과 4g인 두 개의 추가 있을 경우, 주어진 구슬과 1g 추 하나를 양팔 저울의 양쪽에 각각 올려놓아 수평을 이루면 구슬의 무게는 1g이다. 또 다른 구슬이 4g인지를 확인하려면 1g 추 대신 4g 추를 올려놓으면 된다. 구슬이 3g인 경우 …
댓글을 사용할 수 없습니다.