문제
대구 달성공원에 놀러 온 지수는 최근에 새로 만든 타일 장식물을 보게 되었다. 타일 장식물은 정사각형 타일을 붙여 만든 형태였는데, 한 변이 1인 정사각형 타일부터 시작하여 마치 앵무조개의 나선 모양처럼 점점 큰 타일을 붙인 형태였다. 타일 장식물의 일부를 그리면 다음과 같다.
그림에서 타일에 적힌 수는 각 타일의 한 변의 길이를 나타낸다. 타일 장식물을 구성하는 정사각형 타일 한 변의 길이를 안쪽 타일부터 시작하여 차례로 적으면 다음과 같다.
1, 1, 2, 3, 5, 8,...
지수는 문득 이러한 타일들로 구성되는 큰 직사각형의 둘레가 궁금해졌다. 예를 들어, 처음 다섯 개의 타일이 구성하는 직사각형(위에서 빨간색으로 표시한 직사각형)의 둘레는 26이다.
타일의 개수 N(1 ≤ N ≤ 80)이 주어졌을 때, N개의 타일로 구성된 직사각형의 둘레를 구하는 프로그램을 작성하시오.
입력
표준 입력으로 다음 정보가 주어진다. 입력은 한 줄로 구성되며 이 줄에는 타일의 개수를 나타내는 정수 N(1 ≤ N ≤ 80)이 주어진다.
출력
표준 출력으로 N 개의 타일이 구성하는 타일 장식물 직사각형의 둘레를 출력한다.
64비트 정수형인 “long long” 자료형을 써야할 수 있음
테스트 케이스
접근
피보나치 수열로 커지는 타일이 있는데 문제의 그림처럼 붙였을 때 총둘레를 구하는 문제입니다.
타일이 1개일때, f(x)는 총 둘레
f(1) = 4
타일이 2개 일 때
f(2) = f(1)+2*fibo(2)=6
타일이 3개일 때
f(3) = f(2) +2*fibo(3)=10
계속하다 보면 규칙이 보이게 되어 dp를 적용하니 문제가 풀렸습니다.
f(n) = f(n-1) +2*fibo(n)
코드
import java.awt.desktop.SystemEventListener;
import java.io.*;
import java.math.*;
import java.util.*;
public class Main {
/*
13301 problem
*/
public static void main(String[] args) throws NumberFormatException, IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int num = Integer.parseInt(br.readLine());
ArrayList<Long> result = new ArrayList<>();
ArrayList<Long> fibo = new ArrayList<>();
fibo.add((long) 1);
fibo.add((long) 1);
for(int i=2; i<num; i++) {
fibo.add(fibo.get(i-2)+fibo.get(i-1));
}
result.add((long) 4);
for(int i=1; i<num;i++) {
result.add(result.get(i-1)+2*fibo.get(i));
}
bw.write(String.valueOf(result.get(num-1)));
bw.flush();
bw.close();
}
}
주의
오버플로우가 발생하므로 long타입을 써줘야 합니다.
'공부 정리 > 백준' 카테고리의 다른 글
[백준] 자바 2193 이친수 (0) | 2021.07.30 |
---|---|
[백준] 자바 9656 돌 게임 2 (0) | 2021.07.29 |
[백준] 자바 2156 포도주 시식 (0) | 2021.07.27 |
[백준] 자바 1912 연속합 (0) | 2021.07.26 |
[백준] 자바 14501 퇴사 (0) | 2021.07.23 |
댓글