우규이인우윀
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 μ •μƒμš°.
우규이인우윀
πŸ‘¨πŸ»β€πŸ’» PS/JAVA

[JAVA] λ°±μ€€ 2225번 【합뢄해】

πŸ‘¨πŸ»β€πŸ’» PS/JAVA

[JAVA] λ°±μ€€ 2225번 【합뢄해】

2022. 9. 29. 21:16


이번 λ¬Έμ œλŠ” 혼자 ν’€μ–΄μ„œ 맀우 λΏŒλ“―ν–ˆλ˜ 문제!

 

ν¬κΈ°ν•˜μ§€ μ•Šμ•„μ„œ κ²°κ΅­ ν’€ 수 μžˆμ—ˆλ‹€~

 

DPλ¬Έμ œλŠ” Dp배열을 μ–΄λ–»κ²Œ 생성할지 κ³ λ―Όν•˜κ³ , 이전 dp값듀을 μ–΄λ–»κ²Œ ν™œμš©ν• μ§€ 고민해보면 닡이 λ³΄μ΄λŠ” 것 κ°™λ‹€.

 

κ·Έλž˜λ„ μ • μ•ˆλ– μ˜€λ₯΄λ©΄, 경우의 수λ₯Ό 직접 적어보며 κ·œμΉ™μ„ 찾으면 해결이 λ˜λŠ” 것 κ°™λ‹€.

 

λ‚˜λŠ” dp[][] 2차원 배열을 μƒκ°ν–ˆλ‹€.

 

아무리 생각해도 1차원 λ°°μ—΄λ‘œλŠ” ν•΄κ²°ν•  수 없을 것이라 νŒλ‹¨ν–ˆλ‹€.

 

μ™œλƒν•˜λ©΄ 수 μžμ²΄μ— λŒ€ν•œ 변화도 있고 수의 κ°―μˆ˜μ— λŒ€ν•œ 변화도 생기기 λ•Œλ¬Έμ΄λ‹€.

 

κ±°λ‘μ ˆλ―Έ ν•˜κ³  μ–΄λ–»κ²Œ ν•΄κ²°ν–ˆλŠ”μ§€ μ„€λͺ…해보겠닀!

 

dp[i][j]μ—λŠ” iλ₯Ό j개둜 ν‘œν˜„ν•˜λŠ” 경우의 수λ₯Ό 기둝할 것이닀.

 


dp[1][ ] 의 κ²½μš°μ—λŠ”

 

dp[1][j] = jκ°€ μ„±λ¦½ν•œλ‹€.

1을 1개둜 ν‘œν˜„ν•  수 μžˆλŠ” 방법은 1 ( 1 )

1을 2개둜 ν‘œν˜„ν•  수 μžˆλŠ” 방법은 2(0+1 , 1+0)

1을 3개둜 ν‘œν˜„ν•  수 μžˆλŠ” 방법은 3(0+0+1 , 0+1+0 , 1+0+0)

……

1을 n개둜 ν‘œν˜„ν•  수 μžˆλŠ” 방법은 nκ°œμ΄λ‹€.

 


dp[2][j] λ₯Ό μ‚΄νŽ΄λ³΄μž

 

2λ₯Ό 1개둜 ν‘œν˜„ν•  수 μžˆλŠ” 경우의 수 1 ( 2 )

2λ₯Ό 2개둜 ν‘œν˜„ν•  수 μžˆλŠ” 경우의 수 3( 0+2 , 1+1, 2+0 )

2λ₯Ό 3개둜 ν‘œν˜„ν•  수 μžˆλŠ” 경우의 수 6( 0+0+2 , 0+1+1, 0+2+0, 1+0+1, 1+1+0, 2+0+0 )

 

μ—¬κΈ°μ„œ μ€‘μš”ν•œ 점 0+0+2 , 0+1+1 , 0+2+0 의 경우의 수λ₯Ό 보면

0+2 μ—μ„œ 뒀에 2λ₯Ό 숫자 2개둜 ν‘œν˜„ν•  수 μžˆλŠ” 경우의 μˆ˜μ΄λ‹€. μ¦‰ dp[2][2]μž„μ„ 확인할 수 μžˆλ‹€.

 

그리고 1+0+1, 1+1+0 은 1+1μ—μ„œ 뒀에 1을 2개둜 ν‘œν˜„ν•  수 μžˆλŠ” 경우의 μˆ˜κ°€ λœλ‹€.

즉, dp[1][2] μž„μ„ μ•Œ 수 μžˆλ‹€. 

 

λ§ˆμ§€λ§‰ 2+0+0은 2λ₯Ό 4개둜 ν‘œν˜„ν•  수 μžˆλŠ” 경우의 수 μ—λŠ” 2+0+0+0 으둜 ν‘œν˜„λ  것이고
2
λ₯Ό 5개둜 ν‘œν˜„ν•  수 μžˆλŠ” 경우의 μˆ˜μ—λŠ” 2+0+0+0+0 으둜 ν‘œν˜„λ  것이닀. 뒀에 κ°„λ‹¨νžˆ +0을 μΆ”κ°€ν•˜λŠ” 경우의 μˆ˜λŠ” 무쑰건 μ‘΄μž¬ν•  것이닀.

 

이 같은 μƒν™©λ•Œλ¬Έμ— λ§€ ν•­λ§ˆλ‹€ dp둜 ν‘œν˜„λ˜λŠ” 것 이외에 경우의 수 1κ°œλŠ” 무쑰건 μ‘΄μž¬ν•œλ‹€.

 

이제 μ–΄λŠμ •λ„ νŒ¨ν„΄μ΄ 보인닀.

 


 

이제, dp[n][k] 둜 생각을 ν•΄λ³΄μž

 

dp[n][1] 은 무쑰건 1κ°œμ΄λ‹€. +0을 뢙일 μˆ˜λ„ μ—†κ³  n을 1개둜 ν‘œν˜„ν•˜λŠ” 경우의 μˆ˜λŠ” n ν•˜λ‚˜μ΄λ‹€.

 

 

dp[n][2] λŠ” 0 + n , 1+(n-1) Β· Β· Β· Β· Β· Β· Β· (n-1) +1 , n +0 일 것이닀.  

μ΄λŠ” n을 1개둜 ν‘œν˜„ν•˜λŠ” 경우의수 + n-1을 1개둜 ν‘œν˜„ν•˜λŠ” 경우의 수 + Β· Β· Β· Β· Β· Β·+ 1을 1개둜 ν‘œν˜„ν•˜λŠ” 경우의 수 + λ§€ ν•­λ§ˆλ‹€ μΆ”κ°€λ˜λŠ” 경우의 수(n+0) κ°€ 될것이닀.

 

즉, dp[n][2] = dp[n][1] + dp[n-2][1] + Β· Β· Β· Β· Β· Β· Β· Β·+dp[1][1] +1 이 λœλ‹€.

 

 

dp[n][3]도 μœ„μ™€ λΉ„μŠ·ν•˜λ‹€. 0+n 을 숫자 3개둜 λ§Œλ“œλ €λ©΄ n을 2개둜 ν‘œν˜„ν•˜λŠ” 경우둜 λ°”κΏ”μ•Ό 숫자 3개둜 ν‘œν˜„μ΄ 될 것이닀.

 

λ˜ν•œ, 1+(n-1) 을 숫자 3개 μ‘°ν•©μœΌλ‘œ λ§Œλ“œλ €λ©΄ n-1을 2개둜 ν‘œν˜„ν•˜λŠ” 경우둜 λ°”κΏ”μ•Ό ν•œλ‹€. Β· Β· Β· Β· Β· Β· Β· (n-1)+1 을 숫자 3개 μ‘°ν•©μœΌλ‘œ λ§Œλ“œλ €λ©΄ 1을 2개둜 ν‘œν˜„ν•˜λŠ” 경우둜 λ°”κΏ”μ•Ό ν•œλ‹€.

그리고 λ§ˆμ§€λ§‰μœΌλ‘œ n + 0 + 0 의 경우의 μˆ˜κ°€ 생긴닀.

 

 

즉 dp[n][3] = dp[n][2] + dp[n-1][2] Β· Β· Β· Β·+dp[1][2] +1 이 λœλ‹€.

 

μ΅œμ’…μ μœΌλ‘œ dp[n][k] = dp[n][k-1]+dp[n-1][k-1]+ Β· Β· Β· Β· Β·+dp[1][k-1] +1 이 됨을 μ•Œ 수 μžˆλ‹€.

 

이제 점화식을 κ΅¬ν–ˆμœΌλ‹ˆ, μ½”λ“œλ‘œμ„œ κ΅¬ν˜„ν•˜λ©΄ λœλ‹€!

 


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] input = br.readLine().split(" ");
		int N = Integer.valueOf(input[0]);
		int K = Integer.valueOf(input[1]);
		
		long [][]dp=new long [N+1][K+1];
		
		for(int i=1;i<=N;i++) {
			for(int j=1;j<=K;j++) {
				dp[i][j]=1; //μ΅œμ†Œ 1개의 경우의 μˆ˜λŠ” μžˆμœΌλ―€λ‘œ 1개둜 λͺ¨λ‘ μ΄ˆκΈ°ν™”
				for(int k=1;k<=N;k++) {
					dp[i][j]+=dp[k][j-1]%1000000000;//κ΅¬ν•œ 점화식
				}
			}
		}
		
		System.out.println(dp[N][K]%1000000000);
	}
}
    'πŸ‘¨πŸ»β€πŸ’» PS/JAVA' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • [JAVA] λ°±μ€€ 11052번 γ€μΉ΄λ“œ κ΅¬λ§€ν•˜κΈ°γ€‘
    • [JAVA] λ°±μ€€ 2011번 γ€μ•”ν˜Έμ½”λ“œγ€‘
    • [JAVA] λ°±μ€€ 9461번 γ€νŒŒλ„λ°˜ μˆ˜μ—΄γ€‘
    • [JAVA] λ°±μ€€ 2133번 【타일 μ±„μš°κΈ°γ€‘
    우규이인우윀
    우규이인우윀
    개발자 κΏˆλ‚˜λ¬΄

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

    단좕킀

    λ‚΄ λΈ”λ‘œκ·Έ

    λ‚΄ λΈ”λ‘œκ·Έ - κ΄€λ¦¬μž ν™ˆ μ „ν™˜
    Q
    Q
    μƒˆ κΈ€ μ“°κΈ°
    W
    W

    λΈ”λ‘œκ·Έ κ²Œμ‹œκΈ€

    κΈ€ μˆ˜μ • (κΆŒν•œ μžˆλŠ” 경우)
    E
    E
    λŒ“κΈ€ μ˜μ—­μœΌλ‘œ 이동
    C
    C

    λͺ¨λ“  μ˜μ—­

    이 νŽ˜μ΄μ§€μ˜ URL 볡사
    S
    S
    맨 μœ„λ‘œ 이동
    T
    T
    ν‹°μŠ€ν† λ¦¬ ν™ˆ 이동
    H
    H
    단좕킀 μ•ˆλ‚΄
    Shift + /
    ⇧ + /

    * λ‹¨μΆ•ν‚€λŠ” ν•œκΈ€/영문 λŒ€μ†Œλ¬Έμžλ‘œ 이용 κ°€λŠ₯ν•˜λ©°, ν‹°μŠ€ν† λ¦¬ κΈ°λ³Έ λ„λ©”μΈμ—μ„œλ§Œ λ™μž‘ν•©λ‹ˆλ‹€.