일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 프로그래머스
- IT개발캠프
- 자바스크립트
- CS
- typescript
- ip
- BFS
- 인사이드아웃
- 유데미
- 스레드
- cs #네트워크
- App Runner
- 알고리즘
- 스나이퍼팩토리
- #프로젝트캠프 #프로젝트캠프후기 #유데미 #스나이퍼팩토리 #웅진씽크빅 #인사이드아웃 #IT개발캠프 #개발자부트캠프 #리액트 #react #부트캠프 #리액트캠프
- 네트워크
- html
- 해시
- 개발자부트캠프
- React.js
- 메모리
- 타입스크립트
- Algorithm
- react
- 프로젝트캠프
- react-query
- 리액트
- 프로세스
- javascript
- 웅진씽크빅
- Today
- Total
Bin's Blog
[프로그래머스] Level2 - 2 x n 타일링(Javascript) 본문
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
▶ 문제 요약
1. 가로 길이가 2이고 세로의 길이가 1인 직사각형모양의 타일이 있다. 직사각형 타일을 이용하여 세로의 길이가 2이고 가로의 길이가 n인 바닥을 가득 채우려고 한다.
2. 타일을 채울 때 두 가지 방법 존재 가로 배치, 세로 배치
3. 경우의 수가 많아질 수 있으므로, 경우의 수를 1000000007으로 나눈 나머지를 return 해라
▶ 코드
function solution(n) {
// dp테이블 생성
let dp = [1, 2];
const mod = 1000000007;
for (let i = 2; i <= n; i++) {
dp[i] = (dp[i-1] + dp[i-2]) % mod;
}
return dp[n-1];
}
▶ 풀이 과정
1. 다이나믹 프로그래밍을 활용한 문제이다. 그림을 보면 조금 이해하는데 도움이 될 것이다.

위의 그림을 보면 세로 길이 2, 가로의 길이가 n = 1일 때 가로 길이 2이고 세로의 길이 1인 타일을 세로로 배치해서 채울 수 있다. n = 2일 때 가로, 세로 방향을 활용해서 타일을 2가지 방법으로 채울 수 있고, n = 3이면 3가지 방법, n = 4이면 5가지 방법이 있다.
2. 위의 방법으로 점화식을 세울 수 있다. dp[n] = dp[n-1] + dp[n-2]이라는 식이 성립된다. 처음에 n = 1은 1, n = 2는 2라는 값을 배열에 담는다. 그리고 2부터 돌면서 위의 점화식으로 구한 값에 제한사항에 언급한 대로 1000000007를 나눈다.
3. dp[n-1]을 한 이유는 dp[0]을 배열에 안 넣었기 때문에 dp[1]에 해당하는 값인 1이 dp[0]으로 인식된다. 그렇기 때문에 -1을 해줘야 우리가 원하는 값을 도출할 수 있다.
▶ 배운점
1. 일정한 패턴을 구해야하는 문제에 dp를 적극적으로 활용해보자. 그리고 dp문제는 직접 써보거나 그리면 도움이 된다.
'Algorithm' 카테고리의 다른 글
[프로그래머스] Level2 - 숫자 변환하기(Javascript) (0) | 2023.04.26 |
---|---|
[프로그래머스] Level2 - 뒤에 있는 큰 수 찾기(Javascript) (0) | 2023.04.25 |
[프로그래머스] Level2 - 프렌즈4블록(Javascript) (0) | 2023.04.24 |
[프로그래머스] Level2 - n진수 게임(Javascript) (0) | 2023.04.23 |
[프로그래머스] Level2 - 압축(Javascript) (0) | 2023.04.22 |