(Java) 백준 9095 - 1, 2, 3 더하기

2022. 5. 10. 04:44·코딩 테스트

문제 유형부터 DP를 이용하라고 나와 있었다.
저번처럼 Top-down 방식과 Bottom-up 방식 모두를 생각해서 풀었다.
나는 Top-down 방식이 먼저 떠올랐고 재귀를 통해 성공했다.
오히려 점화식을 도출해야 풀 수 있는 Bottom-up 방식이 더 어려웠다.
Top-down 방식은 n의 조건이
최대 10이기 때문에 성공한 것 같다.
아마 n의 크기가 컸다면 재귀 호출이 많아져서
시간 초과가 났을것 같다.
Bottom-up 방식에서는 동적으로 배열의 크기를 설정했는데 런타임 에러가 나서
초기값을 11로 고정해서 풀었다.



Top-down 방식 코드

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

public class Main {
    static int answer = 0;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int t = Integer.parseInt(br.readLine());
        int[] n = new int[t];
        for (int i = 0; i < t; i++) {
            n[i] = Integer.parseInt(br.readLine());
        }
        // top-down 방식
        for (int i : n) {
            topDown(i);
            System.out.println(answer);
            answer = 0;
        }
    }

    static void topDown(int num) {
        // 재귀 탈출조건
        if (num == 0) {
            answer++;
            return;
        }
        // 1뺴기
        if (num - 1 >= 0) {
            topDown(num - 1);
        }
        // 2빼기
        if (num - 2 >= 0) {
            topDown(num - 2);
        }
        // 3빼기
        if (num - 3 >= 0) {
            topDown(num - 3);
        }
    }
}


Bottom-up 방식 코드

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

public class Main {
    static int answer = 0;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int t = Integer.parseInt(br.readLine());
        int[] n = new int[t];
        for (int i = 0; i < t; i++) {
            n[i] = Integer.parseInt(br.readLine());
        }
        // bottom-up 방식
        for (int i : n) {
            bottomUp(i);
            System.out.println(answer);
            answer = 0;
        }
    }

    static void bottomUp(int num) {
//        int[] dp = new int[num + 1]; 런타임 에러
        int[] dp = new int[11];
        // 1을 만드는 방법의 수
        dp[1] = 1;
        // 2를 만드는 방법의 수
        dp[2] = 2;
        // 3을 만드는 방법의 수
        dp[3] = 4;
        for (int i = 4; i < num + 1; i++) {
            dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];
        }
        answer = dp[num];
    }
}

'코딩 테스트' 카테고리의 다른 글

(Java) 백준 2606 - 바이러스  (0) 2022.05.11
(Java) 백준 11047 - 동전 0  (0) 2022.05.11
(Java) 백준 11399 - ATM  (0) 2022.05.10
(Java) 백준 1463 - 1로 만들기  (0) 2022.05.07
(Java) 프로그래머스 신고 결과 받기  (0) 2022.05.06
'코딩 테스트' 카테고리의 다른 글
  • (Java) 백준 2606 - 바이러스
  • (Java) 백준 11047 - 동전 0
  • (Java) 백준 11399 - ATM
  • (Java) 백준 1463 - 1로 만들기
로승리
로승리
  • 로승리
    Roy's Blog
    로승리
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Issuefy
      • Language
      • Spring
      • Database
      • Network
      • Kubernetes
      • AWS
      • 코드스쿼드
      • 코딩 테스트
      • 생각정리
      • 국비지원
      • 회고
      • 컨퍼런스, 세미나
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
로승리
(Java) 백준 9095 - 1, 2, 3 더하기
상단으로

티스토리툴바