-
[Algorithm] 프로그래머스 - 타일 장식물 (동적계획법 - Dynamic Programming )Alogorithm 2020. 6. 4. 20:02반응형
프로그래머스 문제입니다.
문제 설명
대구 달성공원에 놀러 온 지수는 최근에 새로 만든 타일 장식물을 보게 되었다. 타일 장식물은 정사각형 타일을 붙여 만든 형태였는데, 한 변이 1인 정사각형 타일부터 시작하여 마치 앵무조개의 나선 모양처럼 점점 큰 타일을 붙인 형태였다. 타일 장식물의 일부를 그리면 다음과 같다.
그림에서 타일에 적힌 수는 각 타일의 한 변의 길이를 나타낸다. 타일 장식물을 구성하는 정사각형 타일 한 변의 길이를 안쪽 타일부터 시작하여 차례로 적으면 다음과 같다.
[1, 1, 2, 3, 5, 8, .]
지수는 문득 이러한 타일들로 구성되는 큰 직사각형의 둘레가 궁금해졌다. 예를 들어, 처음 다섯 개의 타일이 구성하는 직사각형(위에서 빨간색으로 표시한 직사각형)의 둘레는 26이다.타일의 개수 N이 주어질 때, N개의 타일로 구성된 직사각형의 둘레를 return 하도록 solution 함수를 작성하시오.
제한사항
- N은 1 이상 80 이하인 자연수이다.
입출력
입출력 설명
예제 #1
문제에 나온 예와 같습니다.
문제풀이
function solution(N) { // (1) let memo = new Array(N) memo[0] = 4 // (2) let fivo = new Array(N) fivo[0] = 1, fivo[1] = 1 for (let i = 2; i < N; i++) fivo[i] = fivo[i-1] + fivo[i-2] // (3) for (let i = 1; i < N; i++) memo[i] = memo[i-1] + fivo[i]*2 return memo[N-1] }
idea: 쓱쓱..적어가면서 연관을 찾아보니 피보나치 수열을 이용하는 것이 효율적임을 깨달았다
(1) 메모이제이션을 쓸 것이기 때문에 선언하고 초기화를 해준다.
(2) 피보나치 수열을 통해 N만큼 계산해둔다.
(3) 점화식을 만들어보니 규칙이 다음과 같았다.
(i 인덱스의 피보나치 수열 값 *2) + (i-1 인덱스의 memo 값)
1일 때, 4= 4
2일 때, 6= 4 + 1*2
3일 때, 10 = 6 + 2*2
4일 때, 16 = 10 + 3*2
5일 때, 26 = 16 + 5 *2
....
그리고 return!
반응형'Alogorithm' 카테고리의 다른 글
[Algorithm] 프로그래머스 - 베스트앨범 (해시 - Hash) (0) 2020.06.05 [Algorithm] 프로그래머스 - 이중우선순위큐 (힙 - Heap ) (0) 2020.06.04 [Algorithm] 프로그래머스 - 기능개발 (스택, 큐 - Stack, queue ) (0) 2020.06.04 [Algorithm] 프로그래머스 - 예산 (이분탐색) (0) 2020.05.29 [Algorithm] 프로그래머스 - 여행경로 (bfs || dfs - 너비 || 깊이 우선탐색) (0) 2020.05.29