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

27-yuyu0830 #99

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open

27-yuyu0830 #99

wants to merge 1 commit into from

Conversation

yuyu0830
Copy link
Collaborator

@yuyu0830 yuyu0830 commented Sep 4, 2024

πŸ”— 문제 링크

μ„Έ μš©μ•‘

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

3일...? μ—¬νŠΌ κ½€ κΈ΄ μ‹œκ°„

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

❓ 문제

image

❗ 풀이

두 μš©μ•‘κ³ΌλŠ” λ‹€λ₯΄λ‹€! 3가지 μš©μ•‘μ„ μ„žμ–΄μ„œ 0에 κ°€κΉκ²Œ λ§Œλ“€μ–΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— 쑰금 λ‹€λ₯Έ 풀이가 ν•„μš”ν•  것이라고 μƒκ°ν–ˆλ‹€...

1️⃣ 첫번째 풀이

5000 개의 수 μ€‘μ—μ„œ 3개λ₯Ό κ³ λ₯΄λŠ” 경우의 μˆ˜λŠ” λ…Έμ˜¬λžκ²Œλ„ 20,820,835,000 개의 경우의 μˆ˜κ°€ μžˆλ‹€...! μ™„μ „ 탐색은 μ ˆλŒ€ λΆˆκ°€λŠ₯ ν•˜λ‹€κ³  λ³Ό 수 μžˆλ‹€..

그럼 μ΅œλŒ€ν•œ 쀄일 수 μžˆλŠ” 방법이 뭐가 μžˆμ„κΉŒ.

5000 개의 수 μ€‘μ—μ„œ 2개λ₯Ό κ³ λ₯΄λŠ” 경우의 μˆ˜λŠ” 12,497,500 개둜, 아직 ν¬μ§€λ§Œ κ·Έλž˜λ„ 경우의 수λ₯Ό μƒλ‹Ήνžˆ 쀄일 수 μžˆλ‹€. 그리고 2개의 숫자 합이 μ •ν•΄μ‘Œλ‹€λ©΄, 이뢄 탐색을 톡해 3가지 숫자의 합을 0에 μ΅œλŒ€λ‘œ κ°€κΉκ²Œ λ§Œλ“œλŠ” 숫자λ₯Ό 비ꡐ적 λΉ λ₯΄κ²Œ 찾을 수 μžˆλ‹€. 즉 n^2 log n 의 μ‹œκ°„ λ³΅μž‘λ„λ‘œ 찾을 수 μžˆλ‹€.

ν•˜μ§€λ§Œ 이 ν’€μ΄μ—λŠ” 2가지 λ¬Έμ œκ°€ μžˆλ‹€.

첫 λ²ˆμ§ΈλŠ” μš°μ„  쀄인 μ‹œκ°„λ³΅μž‘λ„λ„ μΆ©λΆ„νžˆ 큰 μˆ˜λΌλŠ” 것이고, 두 λ²ˆμ§ΈλŠ” 이뢄 탐색을 ν•  λ•Œ ν˜„μž¬ κ³ λ₯Έ 수λ₯Ό μ œμ™Έν•˜κ³  λ‚˜λ¨Έμ§€ μ€‘μ—μ„œλ§Œ μ°Ύμ•„μ•Όν•˜κΈ°μ— ν•΄λ‹Ή κΈ°λŠ₯을 κ΅¬ν˜„ν•˜κΈ°κ°€ 쑰금 λΉ‘λΉ‘ν•˜λ‹€λŠ” 것이닀. κ·Έλž˜μ„œ 였래였래 κ³ λ―Όν•˜λ‹€ κ²°κ΅­ λΈ”λ‘œκ·Έ 풀이 λ₯Ό μ°Έκ³ ν–ˆλ‹€..


2️⃣ λ‘λ²ˆμ§Έ 풀이

μ—¬κΈ°μ„œ μ’€ 더 주둜 λ‹€λ€˜μ–΄μ•Όν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ€ 투 포인터 μ˜€λ‹€! ꡳ이 2개λ₯Ό 미리 정해두고 λ‚˜λ¨Έμ§€ ν•˜λ‚˜λ₯Ό μ°ΎλŠ”κ²Œ μ•„λ‹Œ ν•œ 개의 수만 μ •ν•΄λ‘” λ’€ λ‚˜λ¨Έμ§€ μˆ«μžμ€‘ κ°€μž₯ 0에 κ°€κΉŒμšΈ 쑰합을 투 포인터λ₯Ό 톡해 μ°ΎλŠ”λ‹€.

μžμ„Έν•œ 방법은 이렇닀. 투 포인터λ₯Ό 톡해 μ°ΎκΈ° μœ„ν•΄ 배열을 μ •λ ¬ν•΄λ‘” λ’€, 숫자 ν•œκ°œ iλ₯Ό κ³ μ •ν•΄λ‘”λ‹€. 이 λ•Œ, μˆ«μžκ°€ κ²ΉμΉ˜λŠ” 경우λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ κ³ μ •ν•  수λ₯Ό μ•žμ—μ„œλΆ€ν„° 순차 νƒμƒ‰ν•˜κ³ , 탐색 λ²”μœ„λ₯Ό κ³ μ •ν•  수 뒀에 μžˆλŠ” 수 둜만 μ œν•œν•œλ‹€. μ•žμ— μžˆλŠ” μˆ˜λ“€μ€ μ•žμ„œ κ³„μ‚°ν•œ 경우의 μˆ˜μ™€ κ²ΉμΉ˜κΈ°μ— μ—°μ‚°ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.

typedef long long ll;

for (int i = 1; i <= n; i++) {
    ll start = i + 1; // 탐색 μ‹œμž‘ν•  수
    ll end = n; // 탐색 끝날 λ²”μœ„
    
    while (start < end) {
        // 투 포인터 탐색
    }
}

start 와 end λ₯Ό 톡해 λ²”μœ„λ₯Ό μ’ν˜€λ‚˜κ°€λ©° 0에 μ΅œλŒ€ν•œ κ°€κΉŒμš΄ 쑰합을 μ°ΎλŠ”λ‹€. 이 λ•Œ 탐색은 start와 endκ°€ λ§Œλ‚  λ•Œ κΉŒμ§€ μ§„ν–‰ν•˜λ©°, 쀑간에 μ„Έ 수의 합이 0κ³Ό λ”μš± κ°€κΉŒμšΈ λ•Œ ν•΄λ‹Ή 정닡을 μ €μž₯ν•΄λ‘”λ‹€.

μ†ŒμŠ€μ½”λ“œ

#include <iostream>
#include <algorithm>

using namespace std;

typedef long long ll;

int n;
ll arr[5001] = {0, };
ll minValue = 999999999999;
ll ans[3] = {0, };

int main() {
    cin >> n;

    for (int i = 1; i <= n; i++) 
        cin >> arr[i];

    sort(arr + 1, arr + n + 1);

    for (int i = 1; i <= n; i++) {
        ll start = i + 1;
        ll end = n;

        while (start < end) {
            ll cur = arr[i] + arr[start] + arr[end];

            if (abs(cur) < minValue) {
                minValue = abs(cur);

                ans[0] = arr[i];
                ans[1] = arr[start];
                ans[2] = arr[end];
            }

            if (cur < 0) start++;
            else end--;
        }
    }

    printf("%d %d %d\n", ans[0], ans[1], ans[2]);
}

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

머리λ₯Ό μ“°μž... 처음 μƒκ°ν•œ 방식이 μƒκ°λ§ŒνΌ 진행이 μ•ˆλœλ‹€λ©΄ λ‹€λ₯Έ λ°©μ‹μœΌλ‘œλ„ μ‹œλ„ν•΄λ³΄λŠ” 것이 μ€‘μš”ν•˜λ‹€... μ™œ 3μΌμ΄λ‚˜ μž‘κ³ μžˆμ—ˆμ„κΉŒ

@yuyu0830 yuyu0830 self-assigned this Sep 4, 2024
@yuyu0830 yuyu0830 changed the title 24-09-04 μ„Έ μš©μ•‘ 27-yuyu0830 Sep 4, 2024
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.

2 participants