우규이인우윀
Eager To Learn 🌌
우규이인우윀
전체 방문자
였늘
μ–΄μ œ

λΈ”λ‘œκ·Έ 메뉴

  • 🏑 ν™ˆ
  • πŸš€ κΉƒν—ˆλΈŒ
  • β›… νƒœκ·Έ ν΄λΌμš°λ“œ
  • λΆ„λ₯˜ 전체보기 (217)
    • πŸ‘¨πŸ»‍πŸ’» PS (170)
      • JAVA (82)
      • MYSQL (1)
      • Docker (2)
      • PYTHON (24)
      • LeetCode 150 (39)
      • Algorithm 기법 (1)
      • 바킹독 (21)
    • λΈ”λ‘œκ·Έ 이사 (0)
    • Error (1)
    • CS (15)
      • DataBase (2)
      • OS (7)
      • Network (1)
      • Spring (1)
      • 자료ꡬ쑰 (3)
      • Java (1)
    • Learned (7)
      • Spring (7)
    • κ°œλ°œμ„œμ  (15)
      • 가상 λ©΄μ ‘ μ‚¬λ‘€λ‘œ λ°°μš°λŠ” λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œ 섀계 기초 (1)
      • 였브젝트 - 쑰영호 (7)
      • μΉœμ ˆν•œ SQL νŠœλ‹ (7)
    • 회고 (2)
hELLO Β· Designed By μ •μƒμš°.
우규이인우윀

Eager To Learn 🌌

πŸ‘¨πŸ»‍πŸ’» PS/JAVA

[JAVA] λ°±μ€€ 2133번 【타일 μ±„μš°κΈ°γ€‘

2022. 9. 27. 23:13

 

 


μ•…--------

 

이 문제 μ—„μ²­ κ°„λ‹¨ν•œ 문제일 쀄 μ•Œμ•˜λŠ”λ°, ν‘ΈλŠ”λ° μ—„μ²­ 였래 κ±Έλ Έλ‹€.

 

κ·Έλž˜μ„œ λ‚΄ κ³΅λΆ€κ³„νšμ— 영ν–₯을 주게된.. μ•Œκ³ λ¦¬μ¦˜ ν•œ 문제 ν’€κ³  μŠ€ν”„λ§ μˆ˜μ—… λ“€μœΌλ €κ³  ν–ˆλŠ”λ° γ…œγ…œ μ•„λ¬΄νŠΌ

 

3*n 곡간에 1*2,2*1 타일을 μ±„μš°λŠ” 문제인데,

 

n이 ν™€μˆ˜ μΌλ•Œμ—λŠ” 3*n = 무쑰건 ν™€μˆ˜ μ΄λ―€λ‘œ, νƒ€μΌμ˜ κ°―μˆ˜κ°€ μ§μˆ˜κ°œλ°–μ— μ—†λŠ” μƒν™©μ—μ„œ ν™€μˆ˜κ³΅κ°„μ„ μ±„μš°λŠ” 것은 λΆˆκ°€λŠ₯ν•˜λ―€λ‘œ n이 ν™€μˆ˜μΈ κ²½μš°λŠ” μƒκ°ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.

 

이제 n이 μ§μˆ˜μΌλ•Œ, κ·œμΉ™μ„ μ°Ύμ•„μ„œ 점화식을 μ„Έμ›Œμ•Ό ν•œλ‹€.

 

 

 

λ¨Όμ € n=2μΌλ•Œ, 3κ°€μ§€ 경우의 μˆ˜κ°€ λ‚˜μ˜€λŠ” 것은 λˆ„κ΅¬λ‚˜ μ•Œ 것이닀. 

 

dp[2] = 3 을 μ΄ˆκΈ°κ°’μœΌλ‘œ μ§€μ •ν•œλ‹€.

 

n=4λΆ€ν„° κ·œμΉ™μ„ μ°Ύμ•„μ•Ό ν•œλ‹€.

 

n=4 μΌλ•Œ, λ¨Όμ € ν•œμͺ½ λ„ˆλΉ„ 2칸을 dp[2]둜 μ±„μš°λŠ” 경우의수만큼 μ±„μšΈ 수 있고, 남은 λ„ˆλΉ„ 2칸도 dp[2] 경우의 수만큼 μ±„μšΈ 수 μžˆλ‹€.

 

ν•˜μ§€λ§Œ, 였λ₯Έμͺ½ 2개의 κ²½μš°μ™€ 같이 dp[2]*dp[2] κ²½μš°μ— ν¬ν•¨λ˜μ§€ μ•ŠλŠ” μ˜ˆμ™Έ κ²½μš°κ°€ 2개 λ°œμƒν•œλ‹€.

 

dp[4]= dp[2]*dp[2] + 2 κ°€ λœλ‹€.

 

n=6일 λ•Œ

 

 

λ¨Όμ € 였λ₯Έμͺ½ λ„ˆλΉ„ 2칸을 dp[2]의 경우의 수 만큼 μ±„μš°λ©΄ 남은 4칸은 dp[4] 경우의 수만큼 μ±„μšΈ 수 μžˆλ‹€.

 

dp[4] 경우의 μˆ˜μ— dp[2]*dp[2] 경우의 수 κΉŒμ§€ ν¬ν•¨ν•˜λ―€λ‘œ μ„±λ¦½ν•œλ‹€.

 

그리고 였λ₯Έμͺ½ λ„ˆλΉ„λ₯Ό dp[4]만큼 μ±„μš°κ³  남은 λ„ˆλΉ„ 2칸을 dp[2] 만큼 μ±„μš°λ©΄ μ€‘λ³΅ν•˜λŠ” 경우의 μˆ˜κ°€ λ°œμƒν•œλ‹€. μ™œλƒν•˜λ©΄ μœ„μ—μ„œ λ§ν–ˆλ“―μ΄ dp[4] 경우의 μˆ˜λŠ” dp[2]*dp[2] 경우의 수λ₯Ό ν¬ν•¨ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

단적인 예둜  μœ„μ™€ 같은 κ²½μš°λŠ” dp[2]*dp[4] 에도 ν¬ν•¨λ˜κ³  dp[4]*dp[2] 경우의 μˆ˜μ—λ„ ν¬ν•¨λ˜κΈ° λ•Œλ¬Έμ΄λ‹€. 

 

λ”°λΌμ„œ dp[4]μ—μ„œ λ°œμƒν•œ μ˜ˆμ™Έ 경우λ₯Ό μ§‘μ–΄λ„£μ—ˆμ„ λ•Œμ—λ§Œ μƒˆλ‘œμš΄ 경우의 μˆ˜κ°€ 될 수 μžˆλ‹€.

 

그리고 n=6일 λ•Œμ—λ„ μ—­μ‹œ μ˜ˆμ™Έκ°€ 2개 λ°œμƒν•œλ‹€.

 

즉. dp[6]=dp[2]*dp[4] + (dp[4]μ—μ„œ λ°œμƒν•˜λŠ” μ˜ˆμ™Έ)*dp[2] + (dp[6]μ—μ„œ λ°œμƒν•˜λŠ” μ˜ˆμ™Έ)

 

 

 

μ΅œμ’…μ μœΌλ‘œ

 

dp[n] = dp[2]*dp[n-2] + [ (dp[4]μ—μ„œ λ°œμƒν•˜λŠ” μ˜ˆμ™Έ)*dp[n-4] + (dp[6]μ—μ„œ λ°œμƒν•˜λŠ” μ˜ˆμ™Έ)*dp[n-6] ............

+(dp[n-2]μ—μ„œ λ°œμƒν•˜λŠ” μ˜ˆμ™Έ)*dp[2] ] + (dp[n]μ—μ„œ λ°œμƒν•˜λŠ” μ˜ˆμ™Έ) 

 

κ°€ 되고 각 μΌ€μ΄μŠ€μ—μ„œ λ°œμƒν•˜λŠ” μ˜ˆμ™ΈλŠ” 항상 2κ°œκ°€ λ‚˜μ˜€λ―€λ‘œ

 

dp[n]=dp[2]*dp[n-2] +[ 2*( dp[n-4] +dp[n-6] .....+dp[2] ) ] + 2κ°€ λ˜λŠ” 것을 μ•Œ 수 μžˆλ‹€.

 

μœ„ 점화식을 μ½”λ“œλ‘œ λ‚˜νƒ€λ‚΄λ©΄ μ•„λž˜μ™€ κ°™λ‹€!

import java.util.Arrays;
import java.util.Scanner;

public class No_2133 {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int N = scanner.nextInt();
		long [] dp = new long [N+2];
		dp[2] = 3;
		for(int n=4;n<=N;n+=2) {
			dp[n]+=dp[n-2]*dp[2];
			for(int j=2;j<=n-4;j+=2) {
				dp[n]+=2*dp[j];
			}
			dp[n]+=2;
		}
		
		System.out.println(dp[N]);
//		System.out.println(Arrays.toString(dp));
	}
}

 

    'πŸ‘¨πŸ»‍πŸ’» PS/JAVA' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • [JAVA] λ°±μ€€ 2225번 【합뢄해】
    • [JAVA] λ°±μ€€ 9461번 γ€νŒŒλ„λ°˜ μˆ˜μ—΄γ€‘
    • [JAVA] λ°±μ€€ 1699번 γ€μ œκ³±μˆ˜μ˜ 합】
    • [JAVA] λ°±μ€€ 2579번 【계단 였λ₯΄κΈ°γ€‘
    우규이인우윀
    우규이인우윀
    개발자 κΏˆλ‚˜λ¬΄

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”