문제 : Level3 타일 장식물
[ 문제출처 ] https://programmers.co.kr/learn/courses/30/lessons/43104
[ 문제풀이 ]
문제는 다음과 같은 타일이 있을 때
안쪽 타일 부터 시작해서 [1, 1, 2, 3, 5, 8, .... , ] 처럼 점점 타일이 확장된다
정답은 N개의 타일로 구성된 직사각형의 둘레를 구하는 것이다
규칙이 보이지 않는가?
n번째 타일의 한 변의 길이는 밑에 식과 같이 정의가 가능 하다.
![\left ( n \geq 2, \, \, side[0] = 0 \right ) \, side[n] = side [n - 1] + side[n-2]](https://latex.codecogs.com/gif.latex?\dpi{100}&space;\left&space;(&space;n&space;\geq&space;2,&space;\,&space;\,&space;side[0]&space;=&space;0&space;\right&space;)&space;\,&space;side[n]&space;=&space;side&space;[n&space;-&space;1]&space;+&space;side[n-2])
한 변의 길이를 정의하였으니 N번째 타일을 하나씩 붙여 가면서 직사각형 둘레의 길이는
어떻게 변하는지 살펴보자
기존에 있던 빨간색의 타일에서 파란색 타일이 추가된 상황이다
타일의 겹치는 부분의 길이를 파란색 타일의 윗변으로 생각해주고
즉 왼쪽 오른쪽 양변의 길이만 더해주면 된다
기존의 타일의 길이에서 (추가되는 타일의 한 변의 길이 * 2)을 더해주면
구하 고자 하는 정답을 구할 수 있다
![length[i] = length[i-1] + \left ( side[i]*2 \right )](https://latex.codecogs.com/gif.latex?\dpi{100}&space;length[i]&space;=&space;length[i-1]&space;+&space;\left&space;(&space;side[i]*2&space;\right&space;))
[ 소스 코드 ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#include <string>
#include <vector>
typedef long long ll;
using namespace std;
const int MAX = 80 + 1;
ll side[MAX], ans[MAX];
ll solution(int N) {
side[0] = 0, side[1] = 1, ans[1] = 4;
for (int i = 2; i <= N; i++) {
side[i] = side[i - 1] + side[i - 2];
ans[i] = ans[i - 1] + (2 * side[i]);
}
return ans[N];
}
|
cs |