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

5-rivkms #18

Merged
merged 2 commits into from
Mar 4, 2024
Merged

5-rivkms #18

merged 2 commits into from
Mar 4, 2024

Conversation

rivkms
Copy link
Collaborator

@rivkms rivkms commented Feb 25, 2024

πŸ”— 문제 링크

μž…λŒ€

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

24+a (아직 문제λ₯Ό λ‹€ 풀지 λͺ»ν•˜μ—¬ 더 고민해봐야할 것 κ°™λ„€μš”)

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

πŸ›‘ 아직 λ―Έμ™„μ„±λœ μ½”λ“œμž…λ‹ˆλ‹€. μ™„μ„±ν•˜κ³  μ½”λ“œλ₯Ό μ˜¬λ €μ•Όν•˜λŠ”λ°...μ£„μ†‘ν•©λ‹ˆλ‹€...😭
‼️ μ•”νŠΌ μ œκ°€ 이건 쑰금 더 풀어보고 λ‹€μŒμ— λ‹€μ‹œ PR둜 μ˜¬λ €λ³΄κ² μŠ΅λ‹ˆλ‹€.

μš°μ„  μ§€κΈˆκΉŒμ§€ ν•œ 접근법을 μ„€λͺ…λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€.

βœ”οΈ 접근법

λ‹€μ–‘ν•œ 접근법이 생각이 λ‚¬μŠ΅λ‹ˆλ‹€.

1️⃣ DP
2️⃣ λ©”λͺ¨μ΄μ œμ΄μ…˜
3️⃣ Backtracking
λ“±...

만...

♦️ μ‚¬κ³ μ˜ 흐름

λŒ€μΆ© κ°œκ³ μƒ ν–ˆλ‹€λŠ” 흔적

λ„€ μ•”νŠΌ, μœ„μͺ½μ˜ λ‚΄μš©μ€ DP ν˜Ήμ€ λ©”λͺ¨μ΄μ œμ΄μ…˜μ„ μ‚¬μš©ν•΄λ³΄κ³ μž ν•˜λŠ” λ…Έλ ₯을 ν•˜μ˜€μœΌλ‚˜, κ·Έ μ‚¬μ΄μ˜ 점화식과 무엇을 μ €μž₯해야할지 κ²°μ •ν•˜μ§€ λͺ»ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

그러던 도쀑, ‼️ Backtracking으둜 μ ‘κ·Όν•΄λ³΄μž ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
이λ₯Ό μœ„ν•˜μ—¬ λ‚ μ§œμ˜ 경과에 따라 Depth둜 μ„€μ •ν•˜κ³  Treeλ₯Ό λ§Œλ“€μ–΄ κ°€λŠ₯ν•œ 경우λ₯Ό 카운트 ν•΄λ³΄κ³ μž ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
이 λ•Œ λͺ‡ 가지 쑰건을 μ‚¬μš©ν•œλ‹€λ©΄ 경우의 수λ₯Ό 쀄일 수 있겠죠. (Backtracking)

1️⃣ 두 경우λ₯Ό λΉ„κ΅ν•˜μ˜€μ„ λ•Œ ν—Œν˜ˆμ„ 더 적게 ν•œ 경우λ₯Ό μš°μ„  μ±„νƒν•œλ‹€.

2️⃣ 이 λ•Œ ν—Œν˜ˆ νšŸμˆ˜κ°€ 적은 μͺ½μ΄ μ΅œμ†Œκ°€μ‚°μ μ„ λ„˜μ§€ λͺ»ν•œλ‹€λ©΄, ν—Œν˜ˆ νšŸμˆ˜κ°€ λ§Žμ€ 것을 μ±„νƒν•œλ‹€.

3️⃣ ν—Œν˜ˆ νšŸμˆ˜κ°€ κ°™λ‹€λ©΄ 가산점이 큰 μͺ½μ„ μ±„νƒν•œλ‹€.

μ΄λŸ¬ν•œ 쑰건을 μ§œλ³΄μ•˜κ³ , 이 쑰건으둜 return값을 νƒν•˜λ„λ‘ μ„€κ³„ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

λ˜ν•œ ν—Œν˜ˆμ„ ν•  경우 λ©°μΉ λ™μ•ˆμ€ ν—Œν˜ˆμ„ λͺ»ν•˜κΈ°μ— 이λ₯Ό μ½”λ“œμ— λ°˜μ˜ν•΄μ•Όκ² μ§€μš”.

πŸ“sudo μ½”λ“œ

κ·Έλ ‡λ‹€λ©΄ λ‹€μŒκ³Ό 같은 sudoμ½”λ“œκ°€ λ‚˜μ˜€κ² λ„€μš”

1️⃣ λ§Œμ•½ leaf에 λ„λ‹¬ν–ˆλ‹€λ©΄ 가산점과 ν—Œν˜ˆ 횟수λ₯Ό λ°˜ν™˜ν•œλ‹€. 
2️⃣ ν—Œν˜ˆμ„ ν•  수 μžˆλ‹€λ©΄, ν—Œν˜ˆμ„ ν•˜λŠ” κ²½μš°μ™€ 그렇지 μ•Šμ€ κ²½μš°μ— λŒ€ν•˜μ—¬ 각각 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œλ‹€.(μž¬κ·€)
    2️⃣-1 두 ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μ„ λΉ„κ΅ν•˜μ—¬ 더 쒋은 값을 returnν•œλ‹€. 
3️⃣ ν—Œν˜ˆμ„ ν•  수 μ—†λ‹€λ©΄, ν—Œν˜ˆμ„ ν•˜μ§€ μ•ŠλŠ” κ²½μš°μ— λŒ€ν•˜μ—¬ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κ³ (μž¬κ·€) κ·Έ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€. 
4️⃣ 2️⃣와3️⃣. 각각의 κ²½μš°μ— λŒ€ν•˜μ—¬ 가산점과 ν—Œν˜ˆ 횟수λ₯Ό μ¦κ°€μ‹œν‚€λŠ” μ½”λ“œλ₯Ό ν¬ν•¨ν•œλ‹€. 

πŸ–₯️ μ½”λ“œ

이λ₯Ό λ°˜μ˜ν•˜μ—¬ μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ˜€λ”λ‹ˆ μ΄λ ‡κ²Œ λ‚˜μ™”μŠ΅λ‹ˆλ‹€.

// <λ―Έμ™„>
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
int N, M, A, D;
vector<int> vec;
pair<int, int> compare(const pair<int, int>& p1, const pair<int, int>& p2) {
    if (p1.second > p2.second) {
        if (p2.first >= M) {
            return p2;
        }
        return p1;
    }
    if (p1.second < p2.second) {
        if (p1.first >= M) {
            return p1;
        }
        return p2;
    }
    return p1.first > p2.first ? p1 : p2;
}

pair<int, int> dfs(bool blood, int point, int num, int n) {
    if (n == N) {
        return pair<int, int>(point, num);
    }
    if (!blood) {
        point += vec[n];
        pair<int, int> p1 = dfs(false, point, num, n + 1);
        pair<int, int> p2 = dfs(true, point, num, n + 1);
        return compare(p1, p2);
    }
    else {
        point += A;
        num += D;
        return dfs(false, point, num, n + 1);
    }
}

int main() {
    int tmp;
    cin >> N >> M;
    for (int i = 0; i < N; i++) {
        cin >> tmp;
        vec.push_back(tmp);
    }
    cin >> A >> D;

    pair<int, int> p = dfs(false, 0, 0, 0);
    if (p.first >= M) {
        cout << -1;
    }
    else {
        cout << p.second;
    }
    return 0;
}

πŸ›‘ λ¬Όλ‘  이 μ½”λ“œλŠ” 잘λͺ»λœ μ½”λ“œμž…λ‹ˆλ‹€!!
ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— λŒ€ν•˜μ—¬ 잘λͺ»λœ 값을 좜λ ₯ν•˜κΈ°μ— 였λ₯˜λ₯Ό μž‘μ•„μ•Ό ν•  것 κ°™μŠ΅λ‹ˆλ‹€.
κ·Έ λ‚΄μš©μ— λŒ€ν•˜μ—¬λŠ” λ‹€μŒ 번 PR에 λ°˜μ˜ν•˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

βœ”οΈ λ°”κΏ”μ•Ό ν•  점

1️⃣ 비ꡐ 쑰건을 λ°”κΏ”μ•Ό 함
2️⃣ ν—Œν˜ˆμ„ ν•  수 μ—†λŠ” 기간을 λ°˜μ˜ν•  수 μžˆλ„λ‘ μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ•Όν•¨
3️⃣ κ°€μ§€μΉ˜κΈ° 쑰건을 더 λ„£μ–΄ μ‹œκ°„ 쀄이기

λ¬Όλ‘  μ΄λ ‡κ²Œ μˆ˜μ •ν•΄λ„ μ •λ‹΅μœΌλ‘œ 인정받을 수 μžˆμ„μ§€λŠ” λͺ¨λ₯΄κ² λ„€μš”...일단 계속 λ„μ „ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

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

βœ”οΈ 이 λ¬Έμ œκ°€ DP둜 μ“°λŠ” λ¬Έμ œλΌλŠ”λ°... 사싀 아직 잘 와닿지 μ•ŠμŠ΅λ‹ˆλ‹€. 쑰금 더 κ³΅λΆ€ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.
βœ”οΈ μ€‘μš”ν•œκ±΄ 꺾이지 μ•ŠλŠ” λ§ˆμŒπŸ‘

Copy link
Collaborator

@YIM2UL2ET YIM2UL2ET left a comment

Choose a reason for hiding this comment

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

λ‹€μ–‘ν•œ 풀이 방법을 μƒκ°ν•˜μ…¨λ„€μš”. μ €λŠ” 개인적으둠 μ‹€νŒ¨λ₯Ό κ²½ν—˜ν•˜κ±°λ‚˜, μ§€κΈˆμ²˜λŸΌ μ–΄λ €μš΄ 문제λ₯Ό ν’€μ§€λŠ” λͺ»ν•˜λ”라도 μ΄λ ‡κ²Œ κ³ λ‡Œν•˜κ³  μƒκ°ν•˜λŠ” 과정이 λΉ„λ‘œμ†Œ μ„±μž₯을 ν•΄λ‚˜κ°€λŠ” ν•˜λ‚˜μ˜ 단계라고 μƒκ°ν•©λ‹ˆλ‹€. μˆ˜κ³ ν•˜μ…¨μŠ΅λ‹ˆλ‹€.

μ•„λž˜λŠ” λ¬Έμ œμ— λŒ€ν•œ μ €μ˜ 개인적인 μ•„μ΄λ””μ–΄μž…λ‹ˆλ‹€.

μ ‘κΈ°/펼치기

ν’€λ¦΄μ§€λŠ” λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€λ§Œ 저라면..

  1. λ΄‰μ‚¬μ‹œκ°„μ˜ 총 λˆ„μ  ν•© ꡬ함
  2. if 총 λˆ„μ  합이 M보닀 크면 : return 0
  3. else : 1일뢀터 D일, 2일뢀터 D+1일.. μ΄λ ‡κ²Œ λͺ¨μ„ 수 μžˆλŠ” 봉사 점수λ₯Ό λ°°μ—΄λ‘œ λ§Œλ“¦
  4. 3λ²ˆμ—μ„œ λ§Œλ“  배열을 올림차순 μ •λ ¬
  5. λ°°μ—΄[0~N-1] 와 ν—Œν˜ˆμ μˆ˜λ₯Ό λΉ„κ΅ν•˜μ—¬ μž‘μœΌλ©΄ result++, 크면 return -1
  6. total += ν—Œν˜ˆμ μˆ˜ - λ°°μ—΄μš”μ†Œ
  7. totalκ³Ό M 비ꡐ ν›„ result 좜λ ₯

이λ₯Ό ν† λŒ€λ‘œ μ‹œκ°„λ³΅μž‘λ„λ₯Ό μ€„μ—¬λ‚˜κ°€λŠ” 선택을 ν•  것 κ°™λ„€μš”.

total = λ΄‰μ‚¬μ‹œκ°„μ˜ 총 λˆ„μ  ν•©;

if (total >= M) print 0;  // ν”„λ‘œκ·Έλž¨ μ’…λ£Œ
else {
    result = 0;
    ary[N] = 1일뢀터 D일, 2일뢀터 D+1일.. μ΄λ ‡κ²Œ λͺ¨μ„ 수 μžˆλŠ” 봉사 점수λ₯Ό λ°°μ—΄λ‘œ λ§Œλ“ κ²ƒ;
    sort(ary, λ‚΄λ¦Όμ°¨μˆœ);  // μ •λ ¬
    for (i = 0 ~ N-1) {
        if (ary[i] >= A) print -1; // ν”„λ‘œκ·Έλž¨ μ’…λ£Œ
        total += A - ary[i];
        result++;
        if (total >= M) print result;  // ν”„λ‘œκ·Έλž¨ μ’…λ£Œ
    }
    print -1;  // ν”„λ‘œκ·Έλž¨ μ’…λ£Œ ( λκΉŒμ§€ μ²˜λ¦¬ν–ˆμŒμ—λ„ !(total >= M)일 κ²½μš°μ— λŒ€ν•œ 처리 )
}

Copy link
Member

@kjs254 kjs254 left a comment

Choose a reason for hiding this comment

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

문제 이름과 μ •λ‹΅λ₯ μ„ 보고 쉽지 μ•Šκ² κ΅¬λ‚˜ 싢은 문제 κ°™μŠ΅λ‹ˆλ‹€.

μ•„λž˜λŠ” μ œκ°€ μ§§κ²Œλ‚˜λ§ˆ 써본 접근방법인데 예제λ₯Ό 기반으둜 μ ‘κ·Όν•œκ±°λΌ μ–΄λ””κΉŒμ§€ ν†΅ν• μ§€λŠ” λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€..

예제 μž…λ ₯ 1λ²ˆμ„ 기반으둜 μ ‘κ·Όν•œλ‹€λ©΄,

봉사 점수 λ°°μ—΄ 1 4 8 6 3의 합은 22 μž…λ‹ˆλ‹€. μ΄λŠ” λͺ©ν‘œλ³΄λ‹€ 12점 λΆ€μ‘±ν•©λ‹ˆλ‹€.

νœ΄μ‹ μ‹œκ°„ DλŠ” 2 μž…λ‹ˆλ‹€. λ”°λΌμ„œ ν—Œν˜ˆμ€ 봉사 2μΌμΉ˜λ³΄λ‹€ 더 λ§Žμ€ 점수λ₯Ό 받을 수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

예제의 경우 2일을 λ°”μ³μ„œ 받을 수 μžˆλŠ” μ μˆ˜λŠ” 5 12 14 9 3μž…λ‹ˆλ‹€. (μž…λŒ€ μ§ν›„κΉŒμ§€ κ³ λ €)

12점을 더 μ–»κΈ°μœ„ν•΄ 첫째날과 λ§ˆμ§€λ§‰λ‚ μ— ν—Œν˜ˆμ„ ν•©λ‹ˆλ‹€.

μ΄λŸ°μ‹μœΌλ‘œ μ ‘κ·Όν•΄λ³΄μ•˜λŠ”λ° μ–Όλ§ˆλ‚˜ 도움이 될지 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. μ–΄λ ΅λ„€μš”..

Copy link
Collaborator

@mong3125 mong3125 left a comment

Choose a reason for hiding this comment

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

λŠ¦μ–΄μ„œ μ£„μ†‘ν•©λ‹ˆλ‹€...

λ¬Έμ œκ°€ 쉽지 μ•Šμ€λ° 풀어보고 μ‹Άμ–΄μ„œ 리뷰λ₯Ό 미루닀가 κ°œμΈμΌμ • λ•Œλ¬Έμ— μ΄κΉŒμ§€ 미뀄지고 λ§μ•˜λ„€μš”.

μ „ λ΄‰μ‚¬ν™œλ™ λŒ€λΉ„ ν—Œν˜ˆμ΄ μ΅œλŒ€κ°€ λ˜λŠ” λ‚ μ§œλ₯Ό ν—Œν˜ˆλ‘œ λ¨Όμ € 배열을 바꿔버리고 μ΄ν›„λ‘œ 문제λ₯Ό ν’€μ—ˆλŠ”λ° 잘λͺ»λœ μ ‘κ·Όμ΄μ—ˆλ„€μš”.. λ΄‰μ‚¬ν™œλ™ + ν—Œν˜ˆμ΄ μ΅œμ†Œκ°€ μ•„λ‹ˆλΌ ν—Œν˜ˆμ΄ μ΅œμ†Œλ”λΌκ³ μš”..

κ·Έλž˜μ„œ 제 κΈ°μ‘΄ λ°©λ²•μ—μ„œ kjs254λ‹˜κ³Ό λΉ„μŠ·ν•œ λ°©λ²•μœΌλ‘œ μ ‘κ·Όν•΄λ΄€μ—ˆμŠ΅λ‹ˆλ‹€.

  1. μš°μ„  μ²˜μŒμ— λ΄‰μ‚¬ν™œλ™μ„ λ‹€ λ”ν•©λ‹ˆλ‹€.
  2. 가산점이 λΆ€μ‘±ν•˜λ‹€λ©΄ ν—Œν˜ˆμ„ ν•  수 μžˆλŠ” 졜적인 쑰건에 ν—Œν˜ˆμ„ ν•˜λ‚˜ λ°°μ •ν•΄μš”.
  3. 가산점을 λ§Œμ‘±ν•  λ•ŒκΉŒμ§€ 2λ²ˆμ„ λ°˜λ³΅ν•©λ‹ˆλ‹€.

2번 과정을 ν’€λ‹€κ°€ λ†“μ•„μ„œ 아직 λͺ» ν’€μ—ˆλ„€μš” γ… γ… 

@rivkms
Copy link
Collaborator Author

rivkms commented Mar 4, 2024

λ‹€λ“€ 쒋은 의견 μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.
이 λ¬Έμ œλŠ” μ œκ°€ 계속 κ³ λ―Όν•˜μ—¬ 풀이해보고 λ‹€μŒλ²ˆμ— κΈ°νšŒκ°€ 되면 λ‹€μ‹œ PR ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.
κ°μ‚¬ν•©λ‹ˆλ‹€πŸ˜

@rivkms rivkms merged commit 66e2c42 into main Mar 4, 2024
1 check passed
@rivkms rivkms deleted the 5-rivkms branch March 4, 2024 13:46
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