© 2025 anveloper.dev
GitHub·LinkedIn·Contact

목차

  • 문제
  • 입력
  • 출력
  • 예제
  • 풀이
  • 코드
  • 복잡도
풀이 목록으로 돌아가기

BOJ 11058 - 크리보드

2023-08-15
BOJ
골드 IV
java
원본 문제 보기
다이나믹 프로그래밍

문제

BOJ 11058 - 크리보드

버튼 N번을 눌러 화면에 A를 최대한 많이 출력하라. 사용 가능한 버튼: A 출력, Ctrl-A(전체 선택), Ctrl-C(복사), Ctrl-V(붙여넣기).

입력

N이 주어진다 (1 이상 100 이하).

출력

출력할 수 있는 A의 최대 개수를 출력한다.

예제

입력출력
79

풀이

DP로 i번째 버튼까지 누른 최대 A 개수를 구한다.

  1. dp[i] = i번 눌렀을 때의 최대 A 개수
  2. A를 한 번 누르는 경우: dp[i-1] + 1
  3. Ctrl-A, Ctrl-C 후 Ctrl-V를 k-1번 누르는 경우: dp[i-(k+1)] * k (k=2,3,4)
  4. 모든 경우의 최댓값을 취한다

핵심 아이디어: 선택+복사에 2번, 붙여넣기에 k-1번을 사용하면 k배가 되므로, 최적은 항상 2~4배 곱하기 중 하나이다.

코드

package day599;
 
import java.io.*;
 
public class Day555BOJ11058크리보드 {
  static long[] dp;
 
  public static void main(String[] args) throws Exception {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int n = Integer.parseInt(br.readLine());
    dp = new long[n + 1];
    System.out.println(solve(n));
  }
 
  static long solve(int idx) {
    if (idx <= 0)
      return 0;
    if (idx == 1)
      return dp[idx] = idx;
    if (dp[idx] > 0)
      return dp[idx];
 
    dp[idx] = solve(idx - 1) + 1;
    for (int i = 2; i < 5; i++)
      dp[idx] = Math.max(dp[idx], solve(idx - (i + 1)) * i);
 
    return dp[idx];
  }
}

복잡도

  • 시간: O(N)
  • 공간: O(N)