Java/코딩테스트

백준 2579, 11057 - JAVA

Bubbles 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]);
    }
}