9461๋ฒ: ํ๋๋ฐ ์์ด
์ค๋ฅธ์ชฝ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์ผ๊ฐํ์ด ๋์ ๋ชจ์์ผ๋ก ๋์ฌ์ ธ ์๋ค. ์ฒซ ์ผ๊ฐํ์ ์ ์ผ๊ฐํ์ผ๋ก ๋ณ์ ๊ธธ์ด๋ 1์ด๋ค. ๊ทธ ๋ค์์๋ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ผ๋ก ์ ์ผ๊ฐํ์ ๊ณ์ ์ถ๊ฐํ๋ค. ๋์ ์์ ๊ฐ์ฅ ๊ธด ๋ณ์
www.acmicpc.net
์๊ณ ๋ฆฌ์ฆ [์ ๊ทผ ๋ฐฉ๋ฒ]
์ด๋ฒ ๋ฌธ์ ๋ ํ ์คํธ ์ผ์ด์ค๊ฐ ์ฌ๋ฌ๊ฐ์ด๋ฏ๋ก ๊ฐ ์ผ์ด์ค๋ง๋ค ๋์ ๊ณํ๋ฒ์ ์ฌ์ฉํด์ผ ํ๋ค.
์๋ฅผ๋ค์ด Func()ํจ์๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๋ค๋ฉด, ์ด ํจ์๋ Func(N) = Func(N-1) + Func(N-2)๋ฅผ ๋ง์กฑํ๋ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ ๊ธฐ๋ฅ์ ๋ด๋นํ๋ค. ์ด ๋ N=4์ ๋ํ์ฌ ๊ฐ์ ๊ตฌํ๊ณ ์ ํ๋ฉด ์๋์ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์น ๊ฒ์ด๋ค.
- Func(4) = Func(3) + Func(2)
- Func(4) = (Func(2) + Func(1)) + Func(2)
์ด๋ฌ๋ฉด ์ ์ด๋ ์ต์ํ N= 1~4 ๊น์ง๋ ํ์์ด ์๋ฃ๋์ด ๊ฐ์ ์ฐพ๊ณ ์์ ๊ฒ์ด๋ค. ๋ง์ฝ ์ดํ์ N์ด 4๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ผ๋ฉด ์ด๋ฏธ ํ์์ด ์๋ฃ๋์๋ ๊ฐ์ด๋ฏ๋ก ํ์ํ ๋ ์ป์๋ ๊ฐ์ ๋ฐ๋ก ๋ฐํํด์ฃผ๋ฉด ๋๋ค. ๋ฐ๋๋ก N=7 ๊ฐ์ด 4๋ณด๋ค ํฐ ์๋ฅผ ํ์ํ๊ฒ ๋๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ์์ ๊ฑฐ์น๋ฉด ๋๋ค.
- Func(7) = Func(6) + Func(5)
- Func(7) = (Func(5) + Func(4)) + (Func(4) + Func(3))
- Func(7) = ((Func(4) + Func(3)) + Func(4)) + (Func(4) + Func(3))
์ด ์ธ๊ฐ์ง ๊ณผ์ ๋ง ๊ฑฐ์น๋ฉด 4์ 3์ ๋ํด ํธ์ถํ ๋ ์ด๋ฏธ ํ์ํ๋ ๊ฐ์ด๋ฏ๋ก ์ฌ๊ธฐ๊น์ง๋ง ํ์ํ ๋ค ๊ฐ์ ๋ฐํํ๋ฉด ๋๋ค. ์ด๋ ๊ฒํ๋ฉด, ์ฃผ์ด์ง๋ N์ ๋ฒ์๊ฐ 1 ≤ N ≤ 100 ์ด๋๋ผ๋ ๋ง์ฝ ์ฃผ์ด์ง๋ ์์ ์ต๋๊ฐ์ด 10์ธ ๊ฒฝ์ฐ๋ ์๊ธฐ ๋๋ฌธ์ 11~100๊น์ง ํ์ํ ํ์๊ฐ ์๋ค๋ ๊ฒ์ด๋ค. ์ฆ, ์ฒ์๋ถํฐ ๋ชจ๋ ๊ฐ์ ๊ตฌํ๋ ๊ฒ๋ณด๋ค๋ ์ํฉ์ ๋ง๊ฒ ํ์ํ ๋ถ๋ถ๋ง ํ์์ ํด์ฃผ๋ ๊ฒ์ด๋ค.
์ด์ ํ๋๋ฐ ์์ด์ ๋ํด ์์๋ณด์๋ฉด,
P(1)๋ถํฐ P(10)๊น์ง ์ฒซ 10๊ฐ ์ซ์๋ 1,1,1,2,2,3,4,5,7,9 ์ด๋ค. ๋ผ๋ ์กฐ๊ฑด์์ ๋ณด๋ฉด ์ฝ๊ฒ ๋ณผ ์ ์๋ค. ๊ทธ๋ฆผ์ผ๋ก ๋ณด์๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
์ฆ, ํผ๋ณด๋์น์๋ ์กฐ๊ธ ๋ค๋ฅธ ์ ์ด๋ผ๋ฉด ๋ ์ธ์ ๊ฐ์ ํฉ์ด ๋ค์ ์ธ๋ฑ์ค์ ์์นํ๋ ๊ฒ์ด ์๋ ๋ค๋ค์์ ์ธ๋ฑ์ค์ ์์นํ๋ค๋ ๊ฒ์ด๋ค.
์์์ผ๋ก ๋ณด์๋ฉด Func(N) = Func(N-2) + Func(N-3)์ด๋ค.
ํ๋๋ฐ ์์ด์ ๊ฒฝ์ฐ, 100์ผ ๋์ ๊ฐ์ด 9000์ต ๊ฐ๊น์ด ๋๊ธฐ ๋๋ฌธ์ intํ์ ๋ฒ์๋ฅผ ๋์ด๊ฐ๋ค. ๊ทธ๋ฌ๋ฏ๋ก long ํ์ ์ผ๋ก ํด์ฃผ์ด์ผ ํ๋ค.
static long[] seq = new long[101]; // ๋ฐฐ์ด ๋น์ด์๋ ํ์๋ -1 ์ด๋ผ๊ณ ๊ฐ์
seq[0] = 0;
seq[1] = 1;
seq[2] = 1;
seq[3] = 1;
long Padovan(int N) {
if(seq[N] == -1) { // ํด๋น ๋ฐฐ์ด์ ๊ฐ์ด ์์๊ฒฝ์ฐ ์ฌ๊ทํธ์ถ
seq[N] = Fib(N - 2) + Fib(N - 3);
}
return seq[N];
}
๋๋ -1๋ก ์ด๊ธฐํ ํด์ฃผ๋ ๋์ Long ํ์ Wrapper Class๋ก ํ์ฌ null ์ฒดํฌ๋ก ํ์๋ฉด ๋ค์๊ณผ ๊ฐ์ด๋ ํ ์ ์๋ค.
static Long[] seq = new Long[101];
seq[0] = 0L;
seq[1] = 1L;
seq[2] = 1L;
seq[3] = 1L;
long Padovan(int N) {
if(seq[N] == null) { // ํด๋น ๋ฐฐ์ด์ ๊ฐ์ด ์์๊ฒฝ์ฐ ์ฌ๊ทํธ์ถ
seq[N] = Fib(N - 2) + Fib(N - 3);
}
return seq[N];
}
์ด ๋ ๋ณ์ ์ด๊ธฐํ ์ L์ด๋ผ๋ ๋ฌธ์๋ฅผ ๋ถ์ด๊ฑฐ๋ (long) 1 ์ด๋ฐ์์ผ๋ก ์บ์คํ ์ ํด์ฃผ์ด์ผํ๋ค.
ํ์ด ๋ฐ ์ฝ๋
- ๋ฐฉ๋ฒ 1 : [Scanner + ์ฌ๊ท]
import java.util.Scanner;
public class Main {
public static Long[] seq = new Long[101];
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
seq[0] = 0L;
seq[1] = 1L;
seq[2] = 1L;
seq[3] = 1L;
int T = in.nextInt();
while(T-- > 0) {
int N = in.nextInt();
System.out.println(padovan(N));
}
}
public static long padovan(int N) {
if(seq[N] == null) { // ํ์ํ์ง ์์ ์ธ๋ฑ์ค์ผ ๊ฒฝ์ฐ ์ฌ๊ทํธ์ถ
seq[N] = padovan(N - 2) + padovan(N - 3);
}
return seq[N];
}
}
- ๋ฐฉ๋ฒ 2 : [BufferedReader + ์ฌ๊ท]
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static Long[] seq = new Long[101];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
seq[0] = 0L;
seq[1] = 1L;
seq[2] = 1L;
seq[3] = 1L;
int T = Integer.parseInt(br.readLine());
while(T-->0) {
sb.append(padovan(Integer.parseInt(br.readLine()))).append('\n');
}
System.out.println(sb);
}
public static long padovan(int N) {
if(seq[N] == null) {
seq[N] = padovan(N - 2) + padovan(N - 3);
}
return seq[N];
}
}
- ๋ฐฉ๋ฒ 3 : [BufferedReader + ๋ฐ๋ณต๋ฌธ]
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
static long[] seq = new long[101];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
padovan();
int T = Integer.parseInt(br.readLine());
for (int i = 0; i < T; i++) {
sb.append(seq[Integer.parseInt(br.readLine())]).append('\n');
}
System.out.println(sb);
}
public static void padovan() {
seq[1] = 1;
seq[2] = 1;
seq[3] = 1;
for (int i = 4; i < 101; i++) {
seq[i] = seq[i - 2] + seq[i - 3];
}
}
}