알고리즘/프로그래머스

<프로그래머스> 2 x n 타일

흰색텀블러 2024. 10. 9. 16:44

<링크>

https://school.programmers.co.kr/learn/courses/30/lessons/12900

 

 

 

<문제>

  • 가로 길이가 2이고 세로의 길이가 1인 직사각형모양의 타일이 있습니다. 이 직사각형 타일을 이용하여 세로의 길이가 2이고 가로의 길이가 n인 바닥을 가득 채우려고 합니다. 
  • 타일을 채울 때는 다음과 같이 2가지 방법이 있습니다.
    • 타일을 가로로 배치 하는 경우
    • 타일을 세로로 배치 하는 경우
  • 예를들어서 n이 7인 직사각형은 다음과 같이 채울 수 있습니다.

  • 직사각형의 가로의 길이 n이 매개변수로 주어질 때, 이 직사각형을 채우는 방법의 수를 return 하는 solution 함수를 완성해주세요.

<제한사항>

  • 가로의 길이 n은 60,000이하의 자연수 입니다.
  • 경우의 수가 많아 질 수 있으므로, 경우의 수를 1,000,000,007으로 나눈 나머지를 return해주세요.

<입력 및 출력>

n return
4 5

<아이디어>

  1. dp dp dp dp
  2. 직접 그림을 그리면 큰 도움이 되더군요.. 경우의 수를 예시 문제까지 꼭 그려보세요..ㅎ

<풀이 - Java >

class Solution {
    public int solution(int n) {
        // 영어이름이 기억이 안나니 넌 나누기다.
        int 나누기 = 1000000007;
        // 데이터 값 저장해놓을 녀석
        int[] dp = new int[n+1];
        // 가로길이 1인 녀석을 만드는 방법은 1개..
        dp[1] = 1;
        // 가로길이 2인 녀석을 만든느 방법은 가로로 2개 놓고, 세로로 1개 놓고 그위에 하나 놓고 끝!
        dp[2] = 2;
        // 나머지는 뭐...똑같겠지.. 돌려.
        for(int i = 3; i<=n; i++){
            dp[i] = (dp[i-1]+ dp[i-2]) % 나누기;
        }
        int answer = dp[n];
        return answer;
    }
}