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

8-oesnuj #27

Merged
merged 2 commits into from
Jul 10, 2024
Merged

8-oesnuj #27

merged 2 commits into from
Jul 10, 2024

Conversation

oesnuj
Copy link
Member

@oesnuj oesnuj commented May 13, 2024

πŸ”— 문제 링크

λ°±μ€€ | μΉ΄λ“œ μ •λ ¬ν•˜κΈ°

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

30λΆ„

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

μΉ΄λ“œ λ¬ΆμŒμ„ ν•©μ³κ°€λ©΄μ„œ 비ꡐλ₯Ό μˆ˜ν–‰ν•˜λŠ”λ° μ΅œμ†Œμ˜ λΉ„κ΅λ‘œ ν•©μΉœλ‹€λ©΄ μ΅œμ†Œ λͺ‡λ²ˆμ˜ 비ꡐ가 ν•„μš”ν•œμ§€ λ¬»λŠ” 문제
즉, μš°λ¦¬λŠ” "ν˜„μž¬ μ‘΄μž¬ν•˜λŠ” μΉ΄λ“œ 묢음 μ€‘μ—μ„œ, κ°€μž₯ 적은 2개의 λ¬ΆμŒμ„ μš°μ„ μ μœΌλ‘œ 계산" ν•˜λŠ” 것이 μ •λ‹΅μ΄λΌλŠ” 것을 νŒŒμ•…ν–ˆμŠ΅λ‹ˆλ‹€.
ex) 5 4 3 2 1 μΉ΄λ“œ 묢음이 μ΄λ ‡κ²Œ κ΅¬μ„±λ˜μ–΄ μžˆλ‹€λ©΄
(1+2) + (3+3) + (6+4 )+ (10+5) <= 이게 κ°€μž₯ μ΅œμ†Œμ˜ λΉ„κ΅λ‘œ ν•©μΉ˜λŠ” κ²½μš°μž…λ‹ˆλ‹€.
이전 μΉ΄λ“œ 묢음의 λΉ„κ΅νšŸμˆ˜κ°€ λ‹€μŒ μΉ΄λ“œ λΉ„κ΅νšŸμˆ˜μ— 영ν–₯을 μ£ΌκΈ° λ•Œλ¬Έμ— κ°€μž₯ 적은 μΉ΄λ“œ λ¬ΆμŒμ„ 계속 ν•©μ³μ•Όν•©λ‹ˆλ‹€!!

βœν’€μ΄ κ³Όμ •

N개의 μΉ΄λ“œ λ¬ΆμŒμ—μ„œ κ°€μž₯ μž‘μ€ 두 개λ₯Ό 골라 ν•©μΉœλ‹€ -> ν•©μΉœ 두 μΉ΄λ“œλ₯Ό μΉ΄λ“œ λ¬ΆμŒμ— λ„£λŠ”λ‹€ -> 반볡
N개의 μΉ΄λ“œ λ¬ΆμŒμ—μ„œ μ΅œμ†Œκ°’ 2개λ₯Ό κΊΌλ‚΄κΈ° μœ„ν•΄ μ‚¬μš©ν•œ 것이 μ΅œμ†Œνž™μ΄λ‹€.
μ΄λ•Œ μš°μ„ μˆœμœ„ 큐λ₯Ό μ‚¬μš©ν•΄μ„œ μ΅œμ†Œ νž™μ„ μ‚¬μš©ν–ˆλ‹€.

Note

  1. μΉ΄λ“œ λ¬ΆμŒλ“€μ„ μš°μ„ μˆœμœ„ 큐에 λ“€μ–΄μžˆλ‹€. pop을 2λ²ˆν•΄μ„œ κ°€μž₯ 적은 묢음 2개λ₯Ό λΉΌμ€€λ‹€.

  2. 이 두 λ¬ΆμŒμ„ λ”ν•˜μ—¬ λ‹€μ‹œ μš°μ„ μˆœμœ„ 큐에 pushν•΄μ€€λ‹€.

  3. 두 묢음의 합이 두 묢음의 λΉ„κ΅νšŸμˆ˜ μ΄λ―€λ‘œ result에 더해주고 λ‹€μ‹œ 1번 κ³Όμ •μœΌλ‘œ λŒμ•„κ°„λ‹€.

  4. νž™μ— 1개의 값이 남을 λ•Œ κΉŒμ§€ μœ„ 1 ~ 3 과정을 λ°˜λ³΅ν•œλ‹€. (2κ°œκ°€ λ‚˜μ™€μ„œ 1κ°œκ°€ λ‹€μ‹œ λ“€μ–΄κ°€λ‹ˆ μ–Έμ  κ°€ 1κ°œκ°€ λ‚¨μŒ)

  5. 반볡이 λλ‚¬μ„λ•Œ result의 값이 닡이닀.

πŸ€”μš°μ„ μˆœμœ„ν

μš°μ„ μˆœμœ„ νλŠ” λ“€μ–΄μ˜€λŠ” μˆœμ„œμ— 상관 없이 μš°μ„ μˆœμœ„κ°€ 높은 데이터가 λ¨Όμ € λ‚˜κ°€λŠ” 자료ꡬ쑰
μš°μ„ μˆœμœ„ νλŠ” νž™μ„ μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„ν•˜λŠ” 것이 κ°€μž₯ νš¨μœ¨μ μž…λ‹ˆλ‹€.

(μ΅œμ†Œ)νž™μ€ μ™„μ „ 이진 트리 ꡬ쑰둜 λΆ€λͺ¨λ…Έλ“œλŠ” μžμ‹λ…Έλ“œλ³΄λ‹€ λ°˜λ“œμ‹œ 값이 μž‘μ€ ꡬ쑰λ₯Ό μœ μ§€ν•˜λ©° 데이터λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€.
ν•©λ‹ˆλ‹€.
λ”°λΌμ„œ 값을 νž™μ— μ €μž₯ν•˜λ©΄ 루트(μ΅œμƒμœ„)λ…Έλ“œλŠ” 제일 μž‘μ€ 값이 λ©λ‹ˆλ‹€.
pop을 ν•˜λ©΄ 이 μ΅œμƒμœ„ λ…Έλ“œκ°€ 꺼내지고 λ‹€μŒ μ΅œμ†Ÿκ°’μ΄ μ΅œμƒμœ„λ…Έλ“œλ‘œ κ°€λ©΄μ„œ νŠΈλ¦¬κ°€ λ‹€μ‹œ μ •λ ¬? μ±„μ›Œμ§€κ²Œ λ©λ‹ˆλ‹€.
μ΅œλŒ€νž™μ€ λΆ€λͺ¨λ…Έλ“œ > μžμ‹λ…Έλ“œλ₯Ό μœ μ§€ν•˜λ©΄μ„œ μ €μž₯
image

push μ‹œμ—λŠ” ν•΄λ‹Ή 값이 μ μ ˆν•œ μœ„μΉ˜μ˜ λ…Έλ“œλ‘œ κ°€μ•Όν•˜κΈ° λ•Œλ¬Έμ— μ‹œμž‘λ³΅μž‘λ„ O(log N)
pop μ‹œμ—λŠ” λ£¨νŠΈλ…Έλ“œκ°€ 빠지고 κ·Έ μœ„μΉ˜λ‘œ λ‹€μŒ 값이 μ±„μ›Œμ Έμ•Όν•˜κΈ° λ•Œλ¬Έμ— μ‹œκ°„λ³΅μž‘λ„ O(log N)

νž™ 자료ꡬ쑰 μ°Έκ³ 

πŸ“ƒ μ „μ²΄μ½”λ“œ

#include <iostream>
#include <queue>

using namespace std;

int main() {
    ios::sync_with_stdio(false);    cin.tie(NULL);

    priority_queue <int, vector<int>, greater<int>> pq; //μ΅œμ†Œ νž™μœΌλ‘œ μš°μ„ μˆœμœ„ 큐 μ„ μ–Έ 
    int n; 
    cin >> n;
    for (int i = 0; i < n; i++) //μš°μ„ μˆœμœ„ 큐에 λ‹€ λ„£μŒ
    {
        int x;
        cin >> x;
        pq.push(x);
    }
    int result = 0;
    while(pq.size() > 1) //μš°μ„ μˆœμœ„ 큐에 값이 ν•˜λ‚˜λ§Œ 남을 λ•Œ κΉŒμ§€ 반볡
    {
        // μš°μ„ μˆœμœ„ νμ—μ„œ κ°€μž₯ μž‘μ€ 두 수λ₯Ό κΊΌλ‚΄μ„œ ν•©μΉ¨
        int a = pq.top();
        pq.pop();                                                                                   
        int b = pq.top();
        pq.pop();
        int sum = a + b; 
        pq.push(sum);  // ν•©μΉœ κ²°κ³Όλ₯Ό μš°μ„ μˆœμœ„ 큐에 λ‹€μ‹œ λ„£μŒ 
        
        result += sum;  // 결과값을 λˆ„μ 
    }
    cout << result;
    return 0;
}

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

μ™„μ „ 이진 트리ꡬ쑰λ₯Ό ν™œμš©ν•œ νž™ 자료ꡬ쑰λ₯Ό κ³΅λΆ€ν•˜κ³  ν’€μ–΄λ΄€μŠ΅λ‹ˆλ‹€.
μƒˆλ‘œμš΄ 자료ꡬ쑰λ₯Ό 곡뢀할 λ•Œλ§ˆλ‹€ ν’€ λ¬Έμ œκ°€ μƒκΈ°λ„€μš”

Copy link

@9kyo-hwang 9kyo-hwang left a comment

Choose a reason for hiding this comment

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

μš°μ„ μˆœμœ„νκ°€ κ°€μž₯ 많이 μ“°μ΄λŠ” 곳이라 ν•˜λ©΄... μ—­μ‹œ "그리디"λž‘ "μ΅œλ‹¨κ²½λ‘œ(λ‹€μ΅μŠ€νŠΈλΌ)"라 μƒκ°λ˜λ„€μš”.

마침 ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ—λ„ νž™(heap)으둜 λ”°λ‘œ λͺ¨μ•„놓은 것도 μžˆμœΌλ‹ˆ ν•œ 번 μŠ₯~?

using namespace std;

int main() {
ios::sync_with_stdio(false); cin.tie(NULL);

Choose a reason for hiding this comment

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

μœΌμ•… NULL말고 nullptr μ¨μ£Όμ„Έμš”!

Copy link
Collaborator

@pu2rile pu2rile left a comment

Choose a reason for hiding this comment

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

마침 μ œκ°€ μ΅œκ·Όμ— ν’€μ—ˆλ˜ λ¬Έμ œλ„ 동전 0 그리디인데 ν˜Ήμ‹œ try...??

Copy link
Collaborator

@suhyun113 suhyun113 left a comment

Choose a reason for hiding this comment

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

μ΅œμ†Œ νž™! μ΅œμ†Œ λΉ„μš©μ„ ꡬ할 λ•Œ μ‚¬μš©ν–ˆλ˜ 기얡이 μžˆμ–΄μš”! μ΄μ‚°μˆ˜ν•™ μ‹œκ°„μ— 쑰금 배운 적이 μžˆμ–΄μ„œ μžμ„Έν•œ κ°œλ…μ€ 잘 λͺ°λžλŠ”데, λ‹€μ΅μŠ€νŠΈλΌ 문제λ₯Ό ν’€λ©΄μ„œ λ‹€μ‹œ κ³΅λΆ€ν–ˆμ—ˆκ±°λ“ μš”! μ€€μ„œλ‹˜μ΄ 첨뢀해 μ£Όμ‹  μ‚¬μ΄νŠΈ λ³΄λ©΄μ„œλ„ μ’€ 곡뢀λ₯Ό ν•΄λ΄€λŠ”λ° 'μš°μ„ μˆœμœ„ 큐'λ₯Ό κ΅¬ν˜„ν•  λ•Œ κ°€μž₯ 많이 μ“΄λŠ ꡬ쑰가 heapμ΄λΌλŠ” κ±Έ μ•Œκ²Œλ˜μ—ˆμ–΄μš”! 저도 μš°μ„  μˆœμœ„ 큐 문제 ν•œ 번 풀어봐야 κ² μ–΄μš”πŸ˜

μ΅œμ†Œ νž™μ„ λ§Œμ‘±ν•˜λŠ” μƒνƒœκ°€ λ˜λ„λ‘ μ‚½μž…κ³Ό μ‚­μ œν•˜λŠ” 과정을 λ³΄λ©΄μ„œ νž™ μžλ£Œκ΅¬μ‘°κ°€ μ–΄λ–€μ‹μœΌλ‘œ κ΅¬ν˜„λ˜λŠ” 건지 μ•Œκ²Œ 된 것 κ°™μŠ΅λ‹ˆλ‹€~ ν•˜μ§€λ§Œ μ½”λ“œλŠ” μ–΄λ €μ›Œμš”γ…œγ…œ μ’€ 더 곡뢀가 ν•„μš”ν•  것 κ°™μŠ΅λ‹ˆλ‹€...😭

λ­λž„κΉŒ λ„ν˜„λ‹˜μ΄ 6번째 PR둜 μ˜¬λ¦¬μ…¨λ˜ λ¬Έμ œμ™€ μœ μ‚¬ν•˜λ‹€λŠ” λŠλ‚Œμ„ λ°›μ•˜μ–΄μš” λ³΄λ‹ˆκΉŒ 그리디 문제 μ˜€λŠ”λ°, μ΅œμ†Œκ°’μ„ μ°ΎλŠ” 거라 κ·Έλž¬λ‚˜λ΄μš”! κ΅ν™©λ‹˜ λŒ“κΈ€μ„ λ³΄λ‹ˆ μš°μ„ μˆœμœ„ νλŠ” 그리디와 μ΅œλ‹¨ κ²½λ‘œμ—λ„ 많이 μ“°μ΄λ‚˜λ΄μš”! μƒκ°ν•΄λ³΄λ‹ˆ λͺ¨λ‘ μ΅œμ†Œ, κ°€μž₯ 졜적이 λ˜λŠ” 것을 μ°ΎλŠ” 그런 λŠλ‚Œμ΄λ‹ˆ 많이 μ“°μ΄λ‚˜λ΄μš” ν’€μ—ˆλ˜ λ¬Έμ œλ“€μ΄ λ‹€λ₯Έ 자료ꡬ쑰λ₯Ό μ΄μš©ν•΄μ„œλ„ ν’€ 수 μžˆλ‹€λ‹ˆ μ‹ κΈ°ν•˜κ³  λ‹€λ₯Έ λ°©λ²•μœΌλ‘œλ„ 많이 풀어봐야 κ² μ–΄μš”!

μ΅œμ†Œ νž™μ„ μ΄μš©ν•΄ κ°€μž₯ μž‘μ€ 두 μΉ΄λ“œ λ¬ΆμŒμ„ 반볡적으둜 ν•©μΉ˜λŠ” λ°©μ‹μœΌλ‘œ μ½”λ“œλ₯Ό 잘 μ§  것 κ°™μ•„μš”! μ½”λ“œμ— 주석이 λ§Žμ•„ μ½”λ“œλ₯Ό μ΄ν•΄ν•˜λŠ”λ° λ§Žμ€ 도움이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
PRμˆ˜κ³ ν•˜μ…¨μ–΄μš”~

@oesnuj oesnuj merged commit 7ac923a into main Jul 10, 2024
@oesnuj oesnuj deleted the 8-oesnuj branch July 10, 2024 07:31
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