DP 연습문제 1 - 아파트 색칠

Updated:

Java

DP 연습문제 1 - 아파트 색칠

문제

아파트를 각 층별로 파란색 또는 노란색 페인트로 칠하되 다음과 같은 규칙으로 칠하려고 한다.

노란색은 인접한 두 층에 연속하여 사용할 수 있다.

파란색은 인접한 두 층에 연속하여 사용할 수 없다.

이와 같은 규칙으로 층의 아파트를 칠할 수 있는 방법의 수를 f(n)이라 하면 다음 그림과 같이 f(1) = 2, f(2) = 3 이다.

f(8)을얼마인가?

접근 방법 - 무지성

처음 1층에는 노랑(Y) 파랑(B) 2개가 있다.

Y | B (2)

이제 2층부터, 1층의 Y B에 Y와 B를 가능한 올려본다고 생각한다.
그렇다면 Y위에는 Y B가 올라갈 수 있으며(2), B 위에는 Y 밖에 올라오지 못한다.(1)

Y | B | Y (3)
  Y   | B (2)

3층에도 마찬가지로 가장 최 상단인 Y B Y에 Y B를 가능한 올려본다.
첫번째 Y에는 Y B, 두번째 B에는 Y, 세번째 Y에는 Y B가 올라온다.

Y B | Y | Y B (5)
 Y  | B |  Y  (3)
    Y   |  B  (2)

위와 같이 반복하다보면 f(n) = f(n - 1) + f(n - 2) 발견 할 수 있다.

접근 방법 - 점화식

위 방법을 응용하여 점화식을 세워보자.
역시 제일 위 층에 Y 혹은 B를 쌓아 올린다고 생각하자.
현재 층이 N이면 N - 1층까지 세운 아파트 위에 Y와 B를 올리면 된다.
하지만 문제 조건에서 B는 연속으로 세울 수 없므로, 제일 윗 층에 B가 올려면 반드시 아랫층에는 Y가 와야한다.

따라서, F(N) = 제일 위층에 Y가 올 때 F(N-1) + 제일 위층에 B가 올 때 F(N-2)가 된다.

코드

import java.util.*;
import java.io.*;

public class Main {
	
    public static void main(String []args) throws IOException {        
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	int n = 8;
    	int[] f = new int[n + 1];
    	f[1] = 2;
    	f[2] = 3;
    	
    	for(int i = 3; i <= n; i++) {
    		f[i] = f[i - 1] + f[i - 2];
    	}
    	
    	System.out.println(f[n]);
    	br.close();
    }
    static int stoi(String str) {
    	return Integer.parseInt(str);
    }
}

총평

난이도

⭐⭐★★★

후기

DP 점화식의 기본 문제

개선할 점