๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ProgramSolve/Baekjoon

[BOJ] 13270๋ฒˆ - ํ”ผ๋ณด๋‚˜์น˜ ์น˜ํ‚จ (Java)

by SooooooooS 2023. 12. 6.
728x90

๐Ÿ› ๏ธ ๋ฌธ์ œ ๐Ÿ› ๏ธ


๐Ÿ—’๏ธ ์„ค๋ช… ๐Ÿ—’๏ธ

๊ณ„์† ํ’€์–ด๋ณด์•˜์ง€๋งŒ ์‹คํŒจํ•ด์„œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด๋ฅผ ์ฐธ๊ณ ํ•œ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ๋‚ด๊ฐ€ ์ดํ•ดํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•œ๋‹ค.

์ฒ˜์Œ์—๋Š” ์‚ฌ๋žŒ ์ˆ˜, ์น˜ํ‚จ ์ˆ˜์˜ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ๋ถ„๋ฆฌํ•ด์„œ ์ƒ๊ฐํ•˜์—ฌ ์ด์— ๋Œ€ํ•œ ์—ฐ๊ด€์„ฑ์„ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ–ˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜ ์œ„์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋‘ ๋ณ€์ˆ˜ a์™€ b๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž.

์ฒ˜์Œ a์™€ b๊ฐ€ 1๋‹ญ 2์ธ์„ ๋‚˜ํƒ€๋‚ด๊ณ  ์žˆ์œผ๋ฉด ๋‹ค์Œ a์™€ b์˜ ๊ฐ’์€ 2๋‹ญ 3์ธ์ด ๋˜์–ด์•ผํ•œ๋‹ค.

์ฆ‰, a = b, b = a+b ๋กœ ๊ฐ’์ด ๋ณ€ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๊ฐ€ ๊ตฌํ•ด์•ผํ•  ๊ฒƒ์€ ์ตœ์†Œ ์น˜ํ‚จ ์ˆ˜์™€ ์ตœ๋Œ€ ์น˜ํ‚จ ์ˆ˜์ด๋‹ค.

  • min ๋ฐฐ์—ด : min[i] ๋Š” i์ธ๋ถ„ ์‹œ์ผฐ์„ ๋•Œ ์ตœ์†Œ ์น˜ํ‚จ ์ˆ˜
  • max ๋ฐฐ์—ด : max[i] ๋Š” i์ธ๋ถ„ ์‹œ์ผฐ์„ ๋•Œ ์ตœ๋Œ€ ์น˜ํ‚จ ์ˆ˜

๋‹จ,  ์ด ๋ฐฐ์—ด์€ ํ•ญ์ƒ ๊ธธ์ด๊ฐ€ 3์ด์ƒ์ผ ๊ฒƒ์ด๋‹ค. ๋˜ํ•œ [0, 1๋ฒˆ ์ธ๋ฑ์Šค : 0๋ช…, 1๋ช…]๋Š” ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. → N >= 2

๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ๊ณ„์‚ฐ์„ ์œ„ํ•ด์„œ 0๋ช…์ผ ๊ฒฝ์šฐ ์น˜ํ‚จ์˜ ์ˆ˜ 0์œผ๋กœ ์„ค์ •ํ•ด๋‘”๋‹ค.

์ฃผ์˜ํ•  ์ ์€ min ๋ฐฐ์—ด์˜ 1๋ช…์˜ ์ธ๋ฑ์Šค๋Š” ํฐ ๊ฐ’์œผ๋กœ ์ €์žฅํ•ด๋‘๋Š”๋ฐ ์ด๋Š” ํ™€์ˆ˜๋ช… ์ผ๋•Œ ์ž˜๋ชป๋œ ๊ณ„์‚ฐ์„ ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด 3๋ช…์ผ ๊ฒฝ์šฐ 3์ธ 2๋‹ญ๋งŒ ๊ฐ€๋Šฅํ•œ๋ฐ 2์ธ1๋‹ญ + 1์ธ 0๋‹ญ ์œผ๋กœ ์ž˜๋ชป๋œ ๊ณ„์‚ฐ์ด ์ด๋ฃจ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

max์˜ ๊ฒฝ์šฐ๋Š” ์–ด์ฐจํ”ผ ๊ฐ€๋Šฅํ•œ ํฐ ์ˆ˜๋กœ ๋“ค์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ ์ฒ˜๋ฆฌํ•ด์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค.

 

์ด์™€ ๊ฐ™์€ ์„ฑ์งˆ์„ ์ด์šฉํ•˜์—ฌ b = 2์ผ ๋•Œ (→ 2์ธ 1๋‹ญ์œผ๋กœ ์‹œํ‚ฌ ๊ฒฝ์šฐ) ๋ถ€ํ„ฐ ์ฐจ๋ก€์ฐจ๋ก€ ๊ณ„์‚ฐํ•ด๋ณด๋Š” ๊ฒƒ์ด๋‹ค.

6์ผ ๊ฒฝ์šฐ min, max ๋ฐฐ์—ด ๋ณ€ํ™”

while(b <= n) {
	for(int i = b; i <= n; i++) {
		min[i] = Math.min(min[i], min[i-b] + a);
		max[i] = Math.max(max[i], max[i-b] + a);
	}
	int tmp = b;
	b += a;
	a = tmp;
}

DP๋ฅผ ์ด์šฉํ•˜์—ฌ ํ˜„์žฌ b์ธ a๋‹ญ์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ๊ตฌํ•ด์•ผํ•  n์ธ๋ถ„์˜ ์น˜ํ‚จ ๋งˆ๋ฆฌ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

  • b =  ํ˜„์žฌ ๋ช‡๋ช…๋ถ„์˜ ์„ธํŠธ์ธ์ง€ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜
  • a =  ๊ทธ ์„ธํŠธ์— ๋“ค์–ด์žˆ๋Š” ๋‹ญ์˜ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜
  • i = ๋ช‡ ์ธ๋ถ„์„ ์‹œ์ผœ์•ผํ• ์ง€ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜, ์ด๋Š” ํ•ญ์ƒ b <= i <= n ์กฐ๊ฑด์„ ๋งŒ์กฑํ•œ๋‹ค.
  • i-b = i์ธ๋ถ„ ์ค‘ b์ธ๋ถ„์„ ์ œ์™ธํ•œ ์ธ๋ถ„ = b์ธ a๋‹ญ์„ ์‹œํ‚ค๋ฉด i์ธ๋ถ„์„ ๋งŒ์กฑ = m[i-b] + a

์ด๋ฒˆ์—๋Š” ๊ฑฐ์˜ ํ•ด์„ํ•˜๋Š” ์‹œ๊ฐ„์ด ๋˜์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

์ฝ”๋“œ๋ฅผ ์ฝ๊ณ  ๋™์ž‘ ์›๋ฆฌ๋Š” ๋ฌด์—‡์ด๊ณ  ์™œ ์ด๋ ‡๊ฒŒ ํ•ด์•ผํ•˜์ง€? ๋ผ๋Š” ๊ณ ๋ฏผ์„ ํ•˜๊ฒŒ ๋งŒ๋“  ๋ฌธ์ œ์˜€๋‹ค.

๋‹ค์Œ์—๋Š” ์ง์ ‘ ํ’€ ์ˆ˜ ์žˆ๋„๋ก ๋…ธ๋ ฅํ•ด์•ผ๊ฒ ๋‹ค.


๐Ÿ€ ํ’€์ด ๐Ÿ€

package Baekjoon;

import java.io.*;

public class DP13270 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int n = Integer.parseInt(br.readLine()); //์‚ฌ๋žŒ ์ˆ˜ (n >= 2)

        int a = 1; //1๋‹ญ -> ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์˜ ์ฒซ๋ฒˆ์งธ ํ•ญ
        int b = 2; //2์ธ - > ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์˜ ๋‘๋ฒˆ์งธ ํ•ญ

        int[] min = new int[n+1]; //min[i] : i๋ช…์ผ ๋•Œ ์ตœ์†Œ์˜ ์น˜ํ‚จ ์ˆ˜
        int[] max = new int[n+1]; //max[i] : i๋ช…์ผ ๋•Œ ์ตœ๋Œ€์˜ ์น˜ํ‚จ ์ˆ˜

        for(int i = 1; i <= n; i++) {
            min[i] = 987654321;
        }

        while(b <= n) {
            for(int i = b; i <= n; i++) {
                min[i] = Math.min(min[i], min[i-b] + a);
                max[i] = Math.max(max[i], max[i-b] + a);
            }
            int tmp = b;
            b += a;
            a = tmp;
        }
        bw.write(min[n] + " " + max[n]);
        bw.flush();
        bw.close();
    }
}
728x90