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

7-H0ngJu #166

Merged
merged 2 commits into from
Mar 27, 2024
Merged

7-H0ngJu #166

merged 2 commits into from
Mar 27, 2024

Conversation

H0ngJu
Copy link
Collaborator

@H0ngJu H0ngJu commented Mar 22, 2024

πŸ”— 문제 링크

1,2,3 λ”ν•˜κΈ°

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

1μ‹œκ°„

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

μ €λŠ” DPλ₯Ό λ¨Όμ € κ³΅λΆ€ν•˜κ³ , 이 문제λ₯Ό ν’€μ—ˆμŠ΅λ‹ˆλ‹€.


DPλŠ” 'μ•žμ—μ„œ κ³„μ‚°ν•œ 식을 배열에 미리 μ €μž₯ν•΄λ‘μ–΄μ„œ 연산속도λ₯Ό μ¦κ°€μ‹œν‚€λŠ” ν”„λ‘œκ·Έλž˜λ°'μž…λ‹ˆλ‹€.



κ·Έλž˜μ„œ DP의 핡심은 ν•œ 번 κ³„μ‚°ν•œ 건 λ‹€μ‹œ κ³„μ‚°ν•˜μ§€ μ•ŠλŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.



이 점을 μƒκ°ν•˜κ³  문제λ₯Ό 바라보면, 1,2,3으둜 λ‚˜νƒ€λ‚Ό 수 μžˆλŠ” λ°©λ²•μ˜ 수 f(n)을 계산할 λ•Œ,

μ–΄λ–»κ²Œ ν•˜λ©΄ 이전에 κ³„μ‚°ν–ˆλ˜ 값을 톡해 f(n)을 ꡬ할 수 μžˆλŠ”κ°€? 에 λŒ€ν•œ 해닡을 찾으면 이 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λͺ‡ 번 λ‚˜λˆ„μ–΄μ§€λŠ”κ°€, 1,2,3으둜 λͺ‡ 번 κ³±ν•΄μ„œ n이 λ˜λŠ”κ°€ μͺ½μœΌλ‘œ 생각을 ν•˜λ‹€κ°€



λ‹¨μˆœν•˜κ²Œ 점화식을 μž‘μ„±ν•΄λ³΄μ•˜λ”λ‹ˆ,

κ²°κ΅­ f(n)은 f(n-1) + f(n-2) + f(n-3)ν•œ κ°’κ³Ό λ™μΌν•˜λ‹€λŠ” 결둠이 λ‚˜μ™”κ³  κ·ΈλŒ€λ‘œ μ½”λ“œλ‘œ μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€.



  • μˆ˜λ„μ½”λ“œ
  1. n = 1,2,3인 κ²½μš°μ—λŠ” f(n)이 각각 1, 2, 4이닀
  2. n > 3인 κ²½μš°μ—λŠ” f(n) = f(n-1) + f(n-2) + f(n-3)

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

@Munbin-Lee
Copy link
Member

#include <iostream>
#include <vector>
#include <functional>

using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    vector<int> memo(11, -1);
    memo[0] = 0;
    memo[1] = 1;
    memo[2] = 2;
    memo[3] = 4;

    function<int(int)> dp = [&](int x) {
        int &m = memo[x];

        if (m != -1) {
            return m;
        }

        return m = dp(x - 1) + dp(x - 2) + dp(x - 3);
    };

    int T;
    cin >> T;

    while (T--) {
        int n;
        cin >> n;
        cout << dp(n) << '\n';
    }

    return 0;
}

κ³ μƒν•˜μ…¨μŠ΅λ‹ˆλ‹€.

μ™œ κ·Έλ ‡κ²Œ λ˜λŠ”μ§€ 생각을 ν•΄λ³΄μ•˜λŠ”λ°,

각 경우의 수λ₯Ό λ‚˜μ—΄ν•΄λ³΄λ©΄

1 = 1
2 = 1 + 1 = 2
3 = 1 + 1 + 1 = 1 + 2 = 2 + 1 = 3

μ—¬κΈ°κΉŒμ§€λŠ” μˆ˜μž‘μ—…μœΌλ‘œ κ΅¬ν•΄μ•Όν•˜κ³ 

4 = 1 + 1 + 1 + 1
= 1 + 1 + 2
= 1 + 2 + 1
= 1 + 3
= 2 + 1 + 1
= 2 + 2
= 3 + 1

4 = 1 + (3) = 2 + (2) = 3 + (1) 인데,

μ•žμ˜ 숫자λ₯Ό κ³ μ •ν•˜λ©΄ 4λ₯Ό λ§Œλ“œλŠ” 경우의 μˆ˜λŠ” 3을 λ§Œλ“œλŠ” + 2λ₯Ό λ§Œλ“œλŠ” + 1을 λ§Œλ“œλŠ” 경우의 μˆ˜μ™€ κ°™κΈ° λ•Œλ¬Έμ—

dp(x) = dp(x-1) + dp(x-2) + dp(x-3) μž…λ‹ˆλ‹€.

Copy link
Member

@tgyuuAn tgyuuAn left a comment

Choose a reason for hiding this comment

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

ν—‰ DP둜 ν‘ΈλŠ”κ²Œ 훨씬 λΉ λ₯΄κ² λ„€μš”..

DP λ¬Έμ œμ˜€μœΌλ©΄ μ œν•œμ„ 더 크게 μž‘μ•„μ£Όμ§€..

μ €λŠ” N이 μ΅œλŒ€ 11μ΄μ–΄μ„œ λ°±νŠΈλž˜ν‚ΉμœΌλ‘œ ν’€μ–΄λ΄€μ–΄μš”.

λ°”λ‘œ 이게 λ– μ˜¬λΌμ„œ ν’€μ—ˆλŠ”λ° DPλŠ” λ– μ˜¬λ¦¬μ§€λ„ λͺ»ν–ˆλ„€μš” ..

import sys

def input(): return sys.stdin.readline().rstrip()

N = int(input())

def dfs(target, visited, now, now_set):
    answer = 0

    if target == now:
        if tuple(now_set) not in visited:
            visited.add(tuple(now_set))
            return 1
            
        else: return 0

    for num in [1,2,3]:
        if now - num <= target:
            now_set.append(num)
            answer += dfs(target, visited, now+num, now_set)
            now_set.pop()

    return answer

for _ in range(N):
    target = int(input())
    visited = set()
    now_set = list()
    print(dfs(target, visited, 0, now_set))

@tgyuuAn
Copy link
Member

tgyuuAn commented Mar 25, 2024

ν™μ£Όλ‹˜ 문제 제λͺ©μ΄ 1,2,3 λ”ν•˜κΈ°μΈλ° 1,2,3 λ‚˜λˆ„κΈ°λ‘œ λ˜μ–΄μžˆμ–΄μš”!

@pknujsp
Copy link
Collaborator

pknujsp commented Mar 26, 2024

λ¬ΈλΉˆλ‹˜κ³Ό 같은 λ°©μ‹μœΌλ‘œ ν’€μ–΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€

핡심은 μž…λ ₯ μˆ«μžλ“€ μ€‘μ—μ„œ μ΅œλŒ“κ°’ ν•˜λ‚˜μ— λŒ€ν•΄μ„œλ§Œ κ°€μ§“μˆ˜λ₯Ό κ΅¬ν•˜κ²Œ λ§Œλ“€μ—ˆμ–΄μš”

이 μ—°μ‚° ν•˜λ‚˜λ§Œ ν•˜λ”λΌλ„ λ‹€λ₯Έ μˆ˜λ“€μ— λŒ€ν•œ κ°€μ§“μˆ˜κ°€ memo 맡에 λ‹€ κΈ°λ‘λ˜μ–΄μ„œ
μ΄ν›„μ—λŠ” μˆ«μžλ“€μ€ μˆœνšŒν•˜λ©΄μ„œ memoμ—μ„œ κΊΌλ‚΄ 좜λ ₯만 ν•˜λ©΄ λ©λ‹ˆλ‹€.

[4, 7, 10]이 μž…λ ₯으둜 μ£Όμ–΄μ§€λŠ” κ²½μš°μ—,
10의 κ°€μ§“μˆ˜λ₯Ό κ΅¬ν•˜λŠ” κ³Όμ •μ—μ„œ λ‹€λ₯Έ μˆ˜λ“€μ˜ κ°€μ§“μˆ˜κ°€ κ΅¬ν•΄μ§€λŠ” κ²ƒμž…λ‹ˆλ‹€

10을 λ§Œλ“œλŠ” μ—„μ²­λ‚˜κ²Œ λ§Žμ€ 식듀 μ€‘μ—μ„œ 1 + 1 + 1 + 1 + 3 + 3이 μžˆλŠ”λ°,
일뢀인 1 + 3 + 3κ°€ 7이기 λ•Œλ¬Έμ— 7을 λ§Œλ“œλŠ” κ°€μ§“μˆ˜λ‘œ 이 식이 memo에 κΈ°λ‘λ©λ‹ˆλ‹€

memo = {}

def find(v):
    if v in memo:
        return memo[v]
    if v == 0:
        return 1
    elif v < 0:
        return 0
        
    memo[v] = find(v - 1) + find(v - 2) + find(v - 3)
    return memo[v]

arr = [int(input()) for _ in range(int(input()))]
# μ΅œλŒ“κ°’ ν•˜λ‚˜μ— λŒ€ν•΄μ„œλ§Œ κ°€μ§“μˆ˜λ₯Ό κ΅¬ν•œλ‹€
find(max(arr))

for x in arr:
    print(memo[x])

μ§€κΈˆ λ¬Έμ œμ—μ„œλŠ” n의 크기가 11 미만 μ΄λ‹€λ³΄λ‹ˆ memo μ‚¬μš©μ—†μ΄ μ œμΆœν•΄λ„ ν†΅κ³Όν•˜κΈ΄ ν•©λ‹ˆλ‹€
그런데 λ§Œμ•½ 100 μ΄μƒμ˜ 수λ₯Ό μž…λ ₯으둜 λ„£μœΌλ©΄ μ‹œκ°„μ΄ˆκ³Όκ°€ λ°œμƒν•©λ‹ˆλ‹€

제 μ½”λ“œλ‘œ 500에 λŒ€ν•΄μ„œ κ°€μ§“μˆ˜λ₯Ό κ΅¬ν•˜λ©΄
1306186569702186634983475450062372018715120191391192207156664343051610913971927959744519676992404852130396504615663042713312314219527이 λ˜λŠ”λ°

μˆœμ‹κ°„μ— κ΅¬ν•΄μ§‘λ‹ˆλ‹€.

μœ μ‚¬ν•œ 문제둜 1둜 λ§Œλ“€κΈ° μ‹œλ¦¬μ¦ˆκ°€ μžˆλŠ”λ° μ•ˆ 풀어보셨닀면 μ •μ£Όν–‰ ν•΄λ³΄μ‹œλŠ”κ±° μΆ”μ²œλ“œλ €μš”

개인적으둜 μ—°μŠ΅μ— 도움 많이 λ˜μ—ˆλ˜ λ¬Έμ œμž…λ‹ˆλ‹€

@H0ngJu H0ngJu merged commit 91b36eb into main Mar 27, 2024
@H0ngJu H0ngJu deleted the 7-H0ngJu branch March 27, 2024 16:51
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