1. 문제

 

 

2. 접근법

알고리즘 순서

1. N 값 받기

2. 크리보드의 4가지 역할을 사용하여 1...n번 눌렀을 때 dp배열에 최대 값을 저장

3. dp[N] 값 출력

 

경우의 수 확인

N = 1

A (1)

 

N = 2

AA (2)

 

N = 3

AAA (3)

 

N = 4

AAAA (4)

 

N = 5

AAAAA (5)

 

N = 6

AA(전체선택)(복사)(붙여넣기)(붙여넣기) : AAAAAA (6)

AAA(전체선택)(복사)(붙여넣기) : AAAAAA (6)

AAAAAA (6)

 

N = 7

A (전체선택)(복사)(붙)(붙)(붙)(붙) : AAAAA (5)

AA (전체선택)(복사)(붙)(붙)(붙) : AAAAAAAA (8)

AAA (전체선택)(복사)(붙)(붙) : AAAAAAAAA(9)

AAAA (전체선택)(복사)(붙여넣기) : AAAAAAAAA(8)

 

DP배열

1 2 3 4 5 6 7
1 2 3 4 5 6 9

 

점화식 유도

 

1번부터 6번까지는 그냥 A를 찍는게 많다.

7번부터 전체선택, 복사, 붙여넣기 과정이 들어가야 A를 더 많이 찍게된다.

 

N = 7일때 전체선택, 복사, 붙여넣기 하려면 3번을 눌러야 하므로

A를 최대한 많이 찍고 전체 선택, 복사, 붙여넣기를 해야된다.

그렇기에 dp[i-3]인 곳에 전체선택, 복사, 붙여넣기를 하면 총 7번을 누르게 된다.

그리고 붙여 넣기를 했기 때문에 dp[i-3]의 개수에서 2배가 된다.

점화식은 dp[i-3] * 2

 

하지만 미리 복사를 해놨으면 한 번 더 붙여 넣기를 했을 때 A의 개수가 증가한다.

 

dp[7] = dp[3] * 3 으로 9

따라서 dp[n] = dp[i-j] * (j-1) 

 

3. 코드

package week07;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Baek11058 {
    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(bufferedReader.readLine());
        long[] dp = new long[N+1];

        for (int i = 1; i <= N; i++) {
            dp[i] = i;
        }

        for(int i=7; i <= N; i++){
            for (int j = 3; j < i; j++) {
                dp[i] = Math.max(dp[i], dp[i-j] * (j-1));
            }
        }

        System.out.println(dp[N]);
    }
}

 

 

틀린 이유는 dp 배열을 int로 선언해서 그런듯..

'📖Algorithm > DP' 카테고리의 다른 글

JAVA [Algorithm] - 백준 1010 다리 놓기  (0) 2024.12.29
자바 [Programmers] 2단계 - 멀리 뛰기  (0) 2024.12.06