-
백준 2579, 11057 - JAVAJava/코딩테스트 2023. 7. 5. 03:52
https://www.acmicpc.net/problem/2579
2579번: 계단 오르기
계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. <그림 1>과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점
www.acmicpc.net
(출발지점) 10 20 15 25 10 i (현재 위치) - 한번에 한칸 또는 두칸 이동이 가능하며 세칸을 연달아 올라갈수는 없다.
- DP 배열은 각 칸에서 가질 수 있는 최대 점수로 잡았다.
- 만약 i가 25에 있다고 가정해보자
- 이경우 DP[i-3] (표의 10) + stairs [i-1] (표의 15) 또는 DP [i-2] 이 2가지 케이스 중 선택하게 된다.
- DP[i-1]을 사용하지 않는 이유는, 여기 저장된 값 자체만으로는 이전 계단(20)을 밟았는지 안밟았는지 모르므로 현재 25를 밟을 수 있는지 없는지 모른다.
- 따라서 3칸 전 까지의 DP값 + 바로 직전 값을 밟는 것 , 그리고 2칸 전까지의 최댓값(직전값은 안밟은것으로) 2가지중 최대를 고른 후, 현재 위치의 계단 값을 더해서 구해야 한다.
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class p2579 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int num = Integer.parseInt(br.readLine()); int[] DP = new int[num+1]; int[] stairs = new int[num+1]; for (int i = 1; i <= num; i++) { stairs[i] = Integer.parseInt(br.readLine()); } DP[1] = stairs[1]; if (num >= 2) { DP[2] = stairs[1] + stairs[2]; } for (int i = 3; i <= num; i++) { DP[i] = Math.max(DP[i-2], DP[i-3] + stairs[i-1]) + stairs[i]; } System.out.println(DP[num]); } }
https://www.acmicpc.net/problem/11057
11057번: 오르막 수
오르막 수는 수의 자리가 오름차순을 이루는 수를 말한다. 이때, 인접한 수가 같아도 오름차순으로 친다. 예를 들어, 2234와 3678, 11119는 오르막 수이지만, 2232, 3676, 91111은 오르막 수가 아니다. 수
www.acmicpc.net
DP를 이차원 배열로 정의하였다.
이 오르막 수의 규칙은 1자리일 때는 10, 2자리일때는 (10+9+...+1) = 55, 3자리일때는 (1 + 4 + 10 + ... 55) = 220...
이런식으로 n 자릿수의 오르막수 개수는 n-1자릿수를 가지고 구할 수 있다
아래 표의 1열의 마지막 행은 10, 2열의 마지막 행은 55... 즉 이차원 배열의 마지막 행값이 해당 자릿수의 오르막 수 개수가 된다.
그리고 각 칸은 자신의 위쪽 값 + 왼쪽 값으로 구할 수 있다.
즉, DP[i][j] = DP[i-1][j] + DP[i][j-1] 이라는 점화식을 세울 수 있다.
1 2 3 4 5 6 7 8 9 10 1 3 6 10 15 21 28 36 45 55 1 4 10 20 35 56 84 120 165 220 1 5 15 35 70 126 210 330 495 715 1 ... import java.util.Scanner; public class p11057 { public static void main(String[] args) { final int DIV = 10007; Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[][] DP = new int[n][11]; for (int i = 1; i <= 10; i++) { DP[0][i] = i; } for (int i = 0; i < n; i++) { DP[i][1] = 1; } for (int r = 1; r < n; r++) { for (int i = 2; i <= 10; i++) { DP[r][i] = ((DP[r-1][i] % DIV) + (DP[r][i-1] % DIV)) % DIV; } } System.out.println(DP[n-1][10]); } }
'Java > 코딩테스트' 카테고리의 다른 글
백준 1149, 12852, 17135 (0) 2023.07.21 백준 20058, 프로그래머스 - 섬 연결하기, 보석쇼핑 (0) 2023.07.12 백준 11048 - Java (0) 2023.06.29 백준 9205 - Java (0) 2023.06.29 프로그래머스 도둑질 - Java (0) 2023.05.26