๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜

[Java] BOJ 1003 ํ”ผ๋ณด๋‚˜์น˜ ํ•จ์ˆ˜

by ๐ŸŠ๊ทค๐ŸŠ 2024. 7. 26.

๋ฌธ์ œ 

๋ฌธ์ œ ๋งํฌ https://www.acmicpc.net/problem/1003

  • ๋‹ค์Œ ์†Œ์Šค๋Š” N๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” C++ ํ•จ์ˆ˜์ด๋‹ค.fibonacci(3)์„ ํ˜ธ์ถœํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ์ด ์ผ์–ด๋‚œ๋‹ค. 
int fibonacci(int n) { 
	if (n == 0) { 
    	printf("0"); 
        return 0; 
    } 
    else if (n == 1) { 
    	printf("1"); 
        return 1; 
    } 
    else { 
    	return fibonacci(nโ€1) + fibonacci(nโ€2); 
    } 
}
    • fibonacci(3)์€ fibonacci(2)์™€ fibonacci(1) (์ฒซ ๋ฒˆ์งธ ํ˜ธ์ถœ)์„ ํ˜ธ์ถœํ•œ๋‹ค.
    • fibonacci(2)๋Š” fibonacci(1) (๋‘ ๋ฒˆ์งธ ํ˜ธ์ถœ)๊ณผ fibonacci(0)์„ ํ˜ธ์ถœํ•œ๋‹ค.
    • ๋‘ ๋ฒˆ์งธ ํ˜ธ์ถœํ•œ fibonacci(1)์€ 1์„ ์ถœ๋ ฅํ•˜๊ณ  1์„ ๋ฆฌํ„ดํ•œ๋‹ค.
    • fibonacci(0)์€ 0์„ ์ถœ๋ ฅํ•˜๊ณ , 0์„ ๋ฆฌํ„ดํ•œ๋‹ค.
    • fibonacci(2)๋Š” fibonacci(1)๊ณผ fibonacci(0)์˜ ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ณ , 1์„ ๋ฆฌํ„ดํ•œ๋‹ค.
    • ์ฒซ ๋ฒˆ์งธ ํ˜ธ์ถœํ•œ fibonacci(1)์€ 1์„ ์ถœ๋ ฅํ•˜๊ณ , 1์„ ๋ฆฌํ„ดํ•œ๋‹ค.
    • fibonacci(3)์€ fibonacci(2)์™€ fibonacci(1)์˜ ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ณ , 2๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.
    • 1์€ 2๋ฒˆ ์ถœ๋ ฅ๋˜๊ณ , 0์€ 1๋ฒˆ ์ถœ๋ ฅ๋œ๋‹ค. N์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, fibonacci(N)์„ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ, 0๊ณผ 1์ด ๊ฐ๊ฐ ๋ช‡ ๋ฒˆ ์ถœ๋ ฅ๋˜๋Š”์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.
    • ์ฒซ์งธ ์ค„์— ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜ T๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
    • ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ํ•œ ์ค„๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , N์ด ์ฃผ์–ด์ง„๋‹ค. N์€ 40๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜ ๋˜๋Š” 0์ด๋‹ค.
    • ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋งˆ๋‹ค 0์ด ์ถœ๋ ฅ๋˜๋Š” ํšŸ์ˆ˜์™€ 1์ด ์ถœ๋ ฅ๋˜๋Š” ํšŸ์ˆ˜๋ฅผ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ์ถœ๋ ฅํ•œ๋‹ค.

์•„์ด๋””์–ด

  • ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ  dp๋กœ ํ’€์–ด์•ผ๋˜๋Š” ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.
  • ํฐ ์ˆซ์ž๋ฅผ ์ž‘์€ ์ˆซ์ž๋“ค์˜ ๊ฒฐ๊ณผ๊ฐ’์œผ๋กœ ์œ ์ถ”ํ•˜๋Š” ์ƒํ–ฅ์‹์œผ๋กœ ํ’€์–ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

๊ฒช์€ ์‹œํ–‰์ฐฉ์˜ค

  • ์ฒ˜์Œ์— 'dp๊ฐ€ ์ด๋ ‡๊ฒŒ ํ‘ธ๋Š”๊ฒŒ ๋งž๋‚˜?', 'ํ˜น์‹œ ์‹œ๊ฐ„์ดˆ๊ณผ๋‚˜์ง€ ์•Š์„๊นŒ?'๋ผ๋Š” ์ƒ๊ฐ์„ ํ–ˆ์ง€๋งŒ ๋‹คํ–‰ํžˆ ์‹œ๊ฐ„์ดˆ๊ณผ๋‚˜์ง€ ์•Š๊ณ  ๋งž์ถœ ์ˆ˜ ์žˆ์—ˆ๋‹ค. 
  • dp์— ๊ด€ํ•ด์„œ ๊ณต๋ถ€๋ฅผ ์ข€ ๋” ํ•ด๋ด์•ผ๊ฒ ๋‹ค..!

dp๋ผ๋Š” ๊ฐœ๋…์— ๋Œ€ํ•ด ์ข€ ๋” ์ •ํ™•ํžˆ ๊ณต๋ถ€ํ•ด๋ด์•ผ๊ฒ ๋‹ค..!

์ฝ”๋“œ

import java.io.*;
import java.util.*;

public class BOJ1003 {

    static int fibo[][];

    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        // ํ…Œ์ŠคํŠธ์ผ€์ด์Šค ๊ฐœ์ˆ˜
        int T = Integer.parseInt(br.readLine());

        for(int test = 0; test < T; test++){
            // ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆซ์ž
            int N = Integer.parseInt(br.readLine());

            fibo = new int[N + 1][2];

            // 0์˜ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜ ๊ฒฐ๊ณผ๊ฐ’
            fibo[0][0] = 1;
            fibo[0][1] = 0;

            // N๊ฐ’์ด 0๋ณด๋‹ค ํด๋•Œ ํ•จ์ˆ˜๋ฅผ ๋Œ๋ฆผ
            if(N > 0){
                dp(N);
            }

            sb.append(fibo[N][0] + " " + fibo[N][1] + "\n");
        }
        System.out.println(sb);
    }

    public static void dp(int n){
        // 1์˜ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜ ๊ฒฐ๊ณผ๊ฐ’
        fibo[1][0] = 0;
        fibo[1][1] = 1;

        // ์ž…๋ ฅ๋ฐ›์€ ์ˆ˜๊นŒ์ง€ ๋ฐ˜๋ณต๋ฌธ์„ ์ด์šฉํ•˜์—ฌ
        // ํ•˜์œ„๊ฐ’์œผ๋กœ ์ƒ์œ„๊ฐ’์„ ์œ ์ถ”
        for(int i = 2; i <= n; i++){
            // ํ”ผ๋ณด๋‚˜์น˜ ์‹
            fibo[i][0] = fibo[i - 1][0] + fibo[i - 2][0];
            fibo[i][1] = fibo[i - 1][1] + fibo[i - 2][1];
        }
    }
}