본문 바로가기
프로그래머스

[프로그래머스] level 3 - 타일 장식물

by 황인태(intaehwang) 2020. 2. 9.
반응형

https://programmers.co.kr/learn/courses/30/lessons/43104

 

코딩테스트 연습 - 타일 장식물 | 프로그래머스

대구 달성공원에 놀러 온 지수는 최근에 새로 만든 타일 장식물을 보게 되었다. 타일 장식물은 정사각형 타일을 붙여 만든 형태였는데, 한 변이 1인 정사각형 타일부터 시작하여 마치 앵무조개의 나선 모양처럼 점점 큰 타일을 붙인 형태였다. 타일 장식물의 일부를 그리면 다음과 같다. 그림에서 타일에 적힌 수는 각 타일의 한 변의 길이를 나타낸다. 타일 장식물을 구성하는 정사각형 타일 한 변의 길이를 안쪽 타일부터 시작하여 차례로 적으면 다음과 같다. [1, 1

programmers.co.kr

 본 문제는 DP 문제로 분류되어 있지만 메모이제이션 없이도 문제가 해결된다. 

이런 방법으로 타일을 만들 때, n개의 타일의 둘레를 구하는 문제다.

(타일의 개수) : (타일의 둘레)

2 : (2+1) * 2

3 : (3+2) * 2

4 : (5+3) * 2 과 같이 나오는데 일반화를 하면 f(n) = (x+y)*2, f(n+1) = ( (x+y) + x ) * 2로 나타낼 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <string>
#include <vector>
 
using namespace std;
long long answer;
void cal(long long x, long long y, int cnt, int n) {
    if (cnt == n) {
        answer = (x+y)*2;
        return;
    }
    cal(x+y, x, cnt+1, n);
}
 
long long solution(int N) {
    cal(111, N);
    return answer;
}
cs

 

2020-05-07 추가+)

bottom up 방식

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <string>
#include <vector>
 
using namespace std;
 
long long d[81][2];
 
long long solution(int N) {
    
    d[1][0= 1;
    d[1][1= 1;
    for (int i = 2; i <= 80; i++) {
        long long x = d[i-1][0];
        long long y = d[i-1][1];
        d[i][0= y;
        d[i][1= x+y;
    }
    return (d[N][0+ d[N][1])*2;
}
cs
반응형
Buy me a coffeeBuy me a coffee

댓글