๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ

[BOJ] 2193 ์ด์นœ์ˆ˜ (Java)

category Algorithm/BOJ 2022. 9. 6. 22:16

https://www.acmicpc.net/problem/2193

 

2193๋ฒˆ: ์ด์นœ์ˆ˜

0๊ณผ 1๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ์ˆ˜๋ฅผ ์ด์ง„์ˆ˜๋ผ ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์ง„์ˆ˜ ์ค‘ ํŠน๋ณ„ํ•œ ์„ฑ์งˆ์„ ๊ฐ–๋Š” ๊ฒƒ๋“ค์ด ์žˆ๋Š”๋ฐ, ์ด๋“ค์„ ์ด์นœ์ˆ˜(pinary number)๋ผ ํ•œ๋‹ค. ์ด์นœ์ˆ˜๋Š” ๋‹ค์Œ์˜ ์„ฑ์งˆ์„ ๋งŒ์กฑํ•œ๋‹ค. ์ด์นœ์ˆ˜๋Š” 0์œผ๋กœ ์‹œ์ž‘ํ•˜์ง€ ์•Š

www.acmicpc.net


1. ๋ฌธ์ œ ์š”์•ฝ

์ด์นœ์ˆ˜๋ž€, 1~N์ž๋ฆฌ์˜ ์ด์ง„์ˆ˜ ์ค‘์—์„œ 

โ‘  0์œผ๋กœ ์‹œ์ž‘ํ•˜์ง€ ์•Š๊ณ 

โ‘ก 1์ด ๋‘ ๋ฒˆ ์—ฐ์† ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๋Š” ์ˆ˜์ด๋‹ค.

์ œ์•ฝ์กฐ๊ฑด์€ 1<=N<=90์ด๋‹ค.

2. ํ’€์ด

DP๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

์ฒ˜์Œ์—๋Š” ๋ถ€๋ถ„์ง‘ํ•ฉ + ๋น„ํŠธ๋งˆ์Šคํ‚น์œผ๋กœ ์ ‘๊ทผํ•˜์˜€๋‹ค.

N-1์ž๋ฆฌ์˜ ์ˆ˜๊ฐ€ 0์ด๋ฉด continue, 1์ด ์—ฐ์†ํ•ด์„œ ๋‚˜์˜ค๋ฉด continue ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ƒ๊ฐํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด N์ž๋ฆฌ ๊ณ ์ •์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋งŒ์•ฝ N=5์ผ ๋•Œ, ์ด์ง„์ˆ˜ 100์ด ์•„๋‹Œ 00100์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์—

100์€ ์ด์นœ์ˆ˜์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋งจ ์•ž์— 0์ด ์žˆ์–ด ์ด์นœ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฑธ๋กœ ํŒ๋‹จ๋œ๋‹ค.

 ๋”ฐ๋ผ์„œ ์ด ๋ฐฉ๋ฒ•์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

 

๊ทธ๋ž˜์„œ ์ฒ˜์Œ์—” 1์˜ ์ž๋ฆฌ๋ถ€ํ„ฐ 6์˜ ์ž๋ฆฌ๊นŒ์ง€ ์ด์นœ์ˆ˜๋ฅผ ์ง์ ‘ ์ฐพ์•„๋ดค๋‹ค.

1์˜ ์ž๋ฆฌ : 1 => 1

2์˜ ์ž๋ฆฌ : 1 => 10

3์˜ ์ž๋ฆฌ : 2 => 100, 101

4์˜ ์ž๋ฆฌ : 3 => 1000, 1001, 1010

5์˜ ์ž๋ฆฌ : 5 => 10000, 10001, 10010, 10100, 10101

6์˜ ์ž๋ฆฌ : 8 => 100000, 100001, 100101, 101001, 100010, 101010, 100100, 101000

์ด๋ ‡๊ฒŒ ๋ณด๋‹ˆ ์–ด๋””์„œ ๋งŽ์ด ๋ณธ ๋ชจ์–‘์ƒˆ๋‹ค ๊ทธ๊ฒƒ์€ ๋ฐ”๋กœ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด

๊ฐ ์ž๋ฆฌ ๋งˆ๋‹ค ์กด์žฌํ•˜๋Š” ์ด์นœ์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‹ด์•„์ฃผ๋Š” pinary[N+1] ๋ฐฐ์—ด์„ ๋งŒ๋“ค์—ˆ๋‹ค. (0 dummy)

1์˜ ์ž๋ฆฌ, 2์˜ ์ž๋ฆฌ์ผ ๊ฒฝ์šฐ 1์„ ๋ฐ”๋กœ ์ถœ๋ ฅํ•˜๊ฒŒ ํ•˜์˜€๊ณ 

3์˜ ์ž๋ฆฌ๋ถ€ํ„ฐ๋Š”

โ‘  pinary[1] = 1, pinary[2] = 1์„ ๋‹ด์•„์ฃผ๊ณ  ์‹œ์ž‘ํ•˜์—ฌ,

โ‘ก pinary[i] = pinary[i-1] + pinary[i-2] ๋ผ๋Š” ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด ์ ํ™”์‹์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

โ‘ข for๋ฌธ์„ ๋Œ๋ ค 3~N์˜ ์ž๋ฆฌ๋งŒํผ ๋ฐ˜๋ณตํ•˜์˜€๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ pinary[N]์„ ์ถœ๋ ฅํ•˜์˜€๋‹ค.

 

์ด๋ ‡๊ฒŒ๋งŒ ํ•˜๊ณ  ์ œ์ถœํ•˜๋‹ˆ ๋‹น์—ฐํžˆ ํ‹€๋ ธ๋‹ค๊ณ  ๋–ด๋‹ค.

๋‚ด๊ฐ€ ๋†“์นœ ๋ถ€๋ถ„์€ ๋ฒ”์œ„์˜ ์ตœ์†Œ๊ฐ’, ์ตœ๋Œ€๊ฐ’์ด์—ˆ๋‹ค.

- 1, 2๋ฅผ ์ž…๋ ฅํ•˜๋‹ˆ ArrayIndexOutOfBoundsException์˜ค๋ฅ˜๊ฐ€ ๋‚ฌ๋‹ค.

    => 3์ผ ๋•Œ ๋ถ€ํ„ฐ memoization์„ ํ•ด์คฌ๋‹ค.

- 90์„ ์ž…๋ ฅํ•˜๋‹ˆ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋˜์—ˆ๋‹ค.

    => pinary ๋ฐฐ์—ด์„ int -> long ํƒ€์ž…์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ์—ˆ๋‹ค.

์—ญ์‹œ ํ…Œ์ผ€๋Š” ์ž˜ ๋‚˜์˜ค๋Š”๋ฐ ํ‹€๋ ธ์œผ๋ฉด ๋ฒ”์œ„์˜ ์ตœ๋Œ€ ์ตœ์†Œ๋ฅผ ํ™•์ธํ•˜์ž

3. ์ฝ”๋“œ

๋”๋ณด๊ธฐ
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class BOJ_2193_์ด์นœ์ˆ˜{
	
	static int N;
	static long[] pinary;
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());
		pinary = new long[N+1];
		
		if (N == 1) System.out.println(1);
		else if (N == 2) System.out.println(1);
		else if (N >= 3) {
			pinary[1] = 1;
			pinary[2] = 1;
			//dp
			for (int i = 3; i <= N; i++) {
				pinary[i] = pinary[i-1] + pinary[i-2];
			}
			System.out.println(pinary[N]);
		}
	}
	
}