Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

11-seongwon #44

Merged
merged 1 commit into from
May 19, 2024
Merged

11-seongwon #44

merged 1 commit into from
May 19, 2024

Conversation

seongwon030
Copy link
Collaborator

πŸ”— 문제 링크

ν•©λΆ„ν•΄

βœ”οΈ μ†Œμš”λœ μ‹œκ°„

3μ‹œκ°„

✨ μˆ˜λ„ μ½”λ“œ

이전에 ν’€μ—ˆλ˜ 연속합 문제둜 μ ‘κ·Όν•˜λ‹ˆκΉŒ λ„μ €νžˆ 풀리지 μ•Šμ•˜λ‹€. n이 무쑰건 2개의 숫자의 ν•©μœΌλ‘œ λ‚˜νƒ€λ‚˜κ³  k개의 ν•©μœΌλ‘œ 될 λ•ŒκΉŒμ§€ 계속 λ‚˜λˆ„μ–΄μ§€λ―€λ‘œ dpλŠ” λ§žλŠ” 것 κ°™μ•˜λŠ”λ° ν’€λ‹€κ°€ λͺ¨λ₯΄κ² μ–΄μ„œ λ‹€λ₯Έ 풀이λ₯Ό μ°Έμ‘°ν–ˆλ‹€.

일단 kλ₯Ό 1λΆ€ν„° , n은 0λΆ€ν„° ν•΄μ„œ ν‘œλ₯Ό 그리면

k\n 0 1 2
1 0 1 2
2 00 01,10 02, 11, 20
3 000 100, 001, 010 002, 011, 101, 020, 110, 200

μ΄λ ‡κ²Œ 되면 dp[k][n] = dp[k-1][n] + dp[k][n-1] μ΄λΌλŠ” 점화식이 λ‚˜μ˜¨λ‹€.

n,k = map(int,input().split())

mod = 1000000000

dp = [[0] * (n+1) for _ in range(k+1)] # 2차원 λ°°μ—΄
dp [0][0] = 1 # μ΄ˆκΈ°κ°’ μ„€μ • 

for i in range(1,k+1):
  for j in range(n+1):
    dp[i][j] = dp[i-1][j] + dp[i][j-1]
    dp[i][j] = dp[i][j] % mod

print(dp[k][n])

πŸ“š μƒˆλ‘­κ²Œ μ•Œκ²Œλœ λ‚΄μš©

λ³΅μž‘ν•΄λ³΄μ΄μ§€λ§Œ μ²˜μŒλΆ€ν„° μ°¨κ·Όμ°¨κ·Ό... 점화식이 μžˆλŠ”μ§€λΆ€ν„° μ°Ύμ•„λ³΄μž

Copy link
Collaborator

@InSange InSange left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저도 μ²˜μŒμ— 연속합에 λ‚šμ—¬λΆ€λ ΈμŠ΅λ‹ˆλ‹€..
k = 1λΆ€ν„° .... N개 κΉŒμ§€ λͺ¨λ“  경우의 수λ₯Ό 체크할 수 μžˆλ„λ‘ν•˜κ³  μ‘°ν•© 식 N!/N-1! + N!/N-2! ... μ΄λŸ°μ‹μœΌλ‘œ μƒκ°ν–ˆμ—ˆλŠ”λ°.. ν•΄λ‹Ή N에 λ“€μ–΄μ˜¬ 수 μžˆλŠ” 수의 κ°€λŠ₯성이 λ„ˆλ¬΄ λ§Žλ”λΌκ΅¬μš©

λŒ€λΆ€λΆ„μ˜ μ–Έμ–΄μ—μ„œλŠ” λ””ν΄νŠΈ μƒμ„±μžλ‘œ μ‚¬μš©λ  값이 μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ•˜μ„ 경우 μ»΄νŒŒμΌλŸ¬κ°€ λŒ€μ‹  μ²˜λ¦¬ν•΄μ€€λ‹€λŠ” 것을 μ•Œκ³  κ³„μ…¨λ‚˜μš”? λ¬Όλ‘  μ‚¬μš©μžκ°€ μ˜λ„ν–ˆλ“  μ˜λ„ν•˜μ§€ μ•Šμ•˜λ“  μ»΄νŒŒμΌλŸ¬κ°€ λŒ€μ‹  μ²˜λ¦¬ν•œλ‹€λŠ” 것은 λ―Έλ―Έν•˜μ§€λ§Œ 그만큼의 μ˜€λ²„ν—€λ“œ(μ‹œκ°„μƒμœΌλ‘œλ‚˜)κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν˜Ήμ—¬λ‚˜ μ“°λ ˆκΈ°κ°’μ΄ λ“€μ–΄κ°ˆ κ°€λŠ₯μ„± (Cμ–Έμ–΄ 처럼)도 λ°°μ œν•  순 μ—†μœΌλ‹ˆ 일일이 μ΄ˆκΈ°ν™” ν•˜λŠ” μŠ΅κ΄€μ„ λ“€μ—¬λ†“λŠ” 것은 μ–΄λ–¨κΉŒμš”?

for (int i = 0; i < k; i++)
	{
		for (int j = 0; j <= N; j++)
		{
			if (i == 0 || j == 0)
			{
				dp[i][j] = 1;
				continue;
			}
			dp[i][j] = (dp[i][j - 1] + dp[i - 1][j])%1000000000;
		}
	}

μ €μ˜ 경우 i와 jκ°€ 0일 경우, 즉 첫번째 값일 경우 1둜 λ‹€ μ΄ˆκΈ°ν™”ν•΄μ„œ μ ‘κ·Όν•˜λŠ” λ°©μ‹μœΌλ‘œ μ§„ν–‰ν•˜μ˜€μŠ΅λ‹ˆλ‹€!

@seongwon030
Copy link
Collaborator Author

저도 μ²˜μŒμ— 연속합에 λ‚šμ—¬λΆ€λ ΈμŠ΅λ‹ˆλ‹€.. k = 1λΆ€ν„° .... N개 κΉŒμ§€ λͺ¨λ“  경우의 수λ₯Ό 체크할 수 μžˆλ„λ‘ν•˜κ³  μ‘°ν•© 식 N!/N-1! + N!/N-2! ... μ΄λŸ°μ‹μœΌλ‘œ μƒκ°ν–ˆμ—ˆλŠ”λ°.. ν•΄λ‹Ή N에 λ“€μ–΄μ˜¬ 수 μžˆλŠ” 수의 κ°€λŠ₯성이 λ„ˆλ¬΄ λ§Žλ”λΌκ΅¬μš©

λŒ€λΆ€λΆ„μ˜ μ–Έμ–΄μ—μ„œλŠ” λ””ν΄νŠΈ μƒμ„±μžλ‘œ μ‚¬μš©λ  값이 μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ•˜μ„ 경우 μ»΄νŒŒμΌλŸ¬κ°€ λŒ€μ‹  μ²˜λ¦¬ν•΄μ€€λ‹€λŠ” 것을 μ•Œκ³  κ³„μ…¨λ‚˜μš”? λ¬Όλ‘  μ‚¬μš©μžκ°€ μ˜λ„ν–ˆλ“  μ˜λ„ν•˜μ§€ μ•Šμ•˜λ“  μ»΄νŒŒμΌλŸ¬κ°€ λŒ€μ‹  μ²˜λ¦¬ν•œλ‹€λŠ” 것은 λ―Έλ―Έν•˜μ§€λ§Œ 그만큼의 μ˜€λ²„ν—€λ“œ(μ‹œκ°„μƒμœΌλ‘œλ‚˜)κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν˜Ήμ—¬λ‚˜ μ“°λ ˆκΈ°κ°’μ΄ λ“€μ–΄κ°ˆ κ°€λŠ₯μ„± (Cμ–Έμ–΄ 처럼)도 λ°°μ œν•  순 μ—†μœΌλ‹ˆ 일일이 μ΄ˆκΈ°ν™” ν•˜λŠ” μŠ΅κ΄€μ„ λ“€μ—¬λ†“λŠ” 것은 μ–΄λ–¨κΉŒμš”?

for (int i = 0; i < k; i++)
	{
		for (int j = 0; j <= N; j++)
		{
			if (i == 0 || j == 0)
			{
				dp[i][j] = 1;
				continue;
			}
			dp[i][j] = (dp[i][j - 1] + dp[i - 1][j])%1000000000;
		}
	}

μ €μ˜ 경우 i와 jκ°€ 0일 경우, 즉 첫번째 값일 경우 1둜 λ‹€ μ΄ˆκΈ°ν™”ν•΄μ„œ μ ‘κ·Όν•˜λŠ” λ°©μ‹μœΌλ‘œ μ§„ν–‰ν•˜μ˜€μŠ΅λ‹ˆλ‹€!

μ•„ν•˜ μ–΄μ°¨ν”Ό μ²«λ²ˆμ§Έκ°’λ“€μ˜ ν•©λΆ„ν•΄λŠ” ν•˜λ‚˜λ°–μ— μ•ˆ 되기 λ•Œλ¬Έμ— 미리 1둜 μ΄ˆκΈ°ν™”ν•˜λŠ” κ²ƒμ΄κ΅°μš”. 였늘 κ°•μ˜μ—μ„œ C++의 μ“°λ ˆκΈ°κ°’μ„ λ°°μ› λŠ”λ° 미리 μ΄ˆκΈ°ν™”ν™”λ©΄ μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ€ 값을 μ»΄νŒŒμΌλŸ¬κ°€ λŒ€μ‹  μ²˜λ¦¬ν•  ν•„μš”κ°€ μ—†κ³  그둜 인해 μ˜€λ²„ν—€λ“œλ₯Ό 쀄일 수 μžˆλ‹€λŠ”κ²Œ ν™• μ™€λ‹Ώλ„€μš”. 쒋은 μŠ΅κ΄€μ„ 듀일 수 μžˆμ„ 것 κ°™μ•„μš” κ°μ‚¬ν•©λ‹ˆλ‹€γ…Žγ…Ž

Copy link
Collaborator

@yuyu0830 yuyu0830 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DP λ¬Έμ œλŠ” 항상 점화식이 μ€‘μš”ν•˜μ£ .. 저도 이 문제 λ…ΈνŠΈμ—λ‹€κ°€ 4 * 6 의 경우의 수 λ‹€ 적어보고 λ‚˜μ„œ κ·Έμ œμ„œμ•Ό κΉ¨λ‹¬μ•˜λ˜ 기얡이 μžˆλ„€μš”
μžμ—°μˆ˜ n을 k개의 μžμ—°μˆ˜λ‘œ λ§Œλ“€ 수 μžˆλŠ” 경우의 μˆ˜λŠ” μ•„λž˜ 2가지 경우의 수의 합이 λ©λ‹ˆλ‹€

  1. k - 1개의 μžμ—°μˆ˜λ‘œ n을 λ§Œλ“œλŠ” 경우의 수 a
    k - 1개의 μžμ—°μˆ˜λ‘œ n을 λ§Œλ“€μ—ˆμœΌλ©΄ 각 μžλ¦¬μ— 0만 λ„£μœΌλ©΄ a개의 경우의 μˆ˜κ°€ λ‚˜μ˜¨λ‹€.
  2. k 개의 μžμ—°μˆ˜λ‘œ n - 1 을 λ§Œλ“œλŠ” 경우의 수 b
    k 개의 μžμ—°μˆ˜λ‘œ n - 1을 λ§Œλ“€μ—ˆμœΌλ©΄ 각 μžλ¦¬μ— 1을 λ„£μœΌλ©΄ b개의 경우의 μˆ˜κ°€ λ‚˜μ˜¨λ‹€.

μžμ—°μŠ€λŸ½κ²Œ 그럼 k개의 μžμ—°μˆ˜λ‘œ n - 2, n - 3... λ“±λ“± 경우의 μˆ˜λ„ κ΅¬ν•΄μ•Όν•˜μ§€ μ•Šλ‚˜ μ‹Άμ§€λ§Œ DP νŠΉμ„±μƒ μ•žμ—μ„œλΆ€ν„° 순차적으둜 κ΅¬ν•˜κΈ° λ•Œλ¬Έμ— n - 1의 경우의 μˆ˜μ—μ„œ 이미 n - 2의 경우의 수λ₯Ό κ΅¬ν–ˆκ³ , n - 2의 경우의 μˆ˜μ—μ„œ 이미 n - 3의 경우의 수λ₯Ό κ΅¬ν–ˆκΈ° λ•Œλ¬Έμ— n - 1만 κ΅¬ν•˜λ©΄ λ©λ‹ˆλ‹€!

#include <iostream>

using namespace std;

int dp[202][202] = {0, };

int main() {
    int n, k; cin >> n >> k;
    for (int i = 0; i <= n; i++) dp[1][i] = 1;

    for (int i = 2; i <= k; i++) {
        for (int j = 0; j <= n; j++) {
            int tmp = 0;
            for (int m = 0; m <= j; m++) {
                tmp += dp[i-1][m];
                tmp %= 1000000000;
            }
            dp[i][j] = tmp;
        }
    }
    
    printf("%d\n", dp[k][n]);
}

μ €λŠ” μ™œ 3쀑 for문을 μΌμ„κΉŒμš”? μ˜ˆμ „ 풀인데 μ§€κΈˆ λ³΄λ‹ˆ 이해가 μ•ˆλ˜λ„€μš”..

Copy link
Contributor

@dhlee777 dhlee777 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

dpλ¬Έμ œλŠ” ν•˜λ‚˜ν•˜λ‚˜ 경우의수λ₯Ό 적어보며 μ•žλ’€ 관계λ₯Ό λ”°μ Έκ°€λ©° 점화식을 λ„μΆœν•΄λ‚΄λŠ”κ²ƒμ΄ 정말 μ€‘μš”ν•œκ±° κ°™μŠ΅λ‹ˆλ‹€. μ½”λ“œλŠ” μ΄λ ‡κ²Œμ§§μ€λ° 점화식을 μƒκ°ν•΄λ‚΄λŠ”κ²Œ 정말 μ–΄λ ΅λ„€μš”.. μ €λŠ” μ—°μ†ν•©λ¬Έμ œλΆ€ν„° ν’€μ–΄λ΄μ•Όκ² λ„€μš©

@seongwon030 seongwon030 merged commit bd75fbf into main May 19, 2024
1 check passed
@seongwon030 seongwon030 deleted the 11-seongwon branch May 19, 2024 15:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants