πŸ•οΈ ICPC Sinchon/Two Pointer

[BOJ][C++] λ°±μ€€ 2467번: μš©μ•‘

선달 2024. 8. 18. 04:58
λ°˜μ‘ν˜•

https://www.acmicpc.net/problem/2467

 

문제

KOI λΆ€μ„€ κ³Όν•™μ—°κ΅¬μ†Œμ—μ„œλŠ” λ§Žμ€ μ’…λ₯˜μ˜ μ‚°μ„± μš©μ•‘κ³Ό μ•ŒμΉΌλ¦¬μ„± μš©μ•‘μ„ λ³΄μœ ν•˜κ³  μžˆλ‹€. 각 μš©μ•‘μ—λŠ” κ·Έ μš©μ•‘μ˜ νŠΉμ„±μ„ λ‚˜νƒ€λ‚΄λŠ” ν•˜λ‚˜μ˜ μ •μˆ˜κ°€ μ£Όμ–΄μ Έμžˆλ‹€. μ‚°μ„± μš©μ•‘μ˜ νŠΉμ„±κ°’μ€ 1λΆ€ν„° 1,000,000,000κΉŒμ§€μ˜ μ–‘μ˜ μ •μˆ˜λ‘œ λ‚˜νƒ€λ‚΄κ³ , μ•ŒμΉΌλ¦¬μ„± μš©μ•‘μ˜ νŠΉμ„±κ°’μ€ -1λΆ€ν„° -1,000,000,000κΉŒμ§€μ˜ 음의 μ •μˆ˜λ‘œ λ‚˜νƒ€λ‚Έλ‹€.

같은 μ–‘μ˜ 두 μš©μ•‘μ„ ν˜Όν•©ν•œ μš©μ•‘μ˜ νŠΉμ„±κ°’μ€ ν˜Όν•©μ— μ‚¬μš©λœ 각 μš©μ•‘μ˜ νŠΉμ„±κ°’μ˜ ν•©μœΌλ‘œ μ •μ˜ν•œλ‹€. 이 μ—°κ΅¬μ†Œμ—μ„œλŠ” 같은 μ–‘μ˜ 두 μš©μ•‘μ„ ν˜Όν•©ν•˜μ—¬ νŠΉμ„±κ°’μ΄ 0에 κ°€μž₯ κ°€κΉŒμš΄ μš©μ•‘μ„ λ§Œλ“€λ €κ³  ν•œλ‹€. 

예λ₯Ό λ“€μ–΄, 주어진 μš©μ•‘λ“€μ˜ νŠΉμ„±κ°’μ΄ [-99, -2, -1, 4, 98]인 κ²½μš°μ—λŠ” νŠΉμ„±κ°’μ΄ -99인 μš©μ•‘κ³Ό νŠΉμ„±κ°’μ΄ 98인 μš©μ•‘μ„ ν˜Όν•©ν•˜λ©΄ νŠΉμ„±κ°’μ΄ -1인 μš©μ•‘μ„ λ§Œλ“€ 수 있고, 이 μš©μ•‘μ˜ νŠΉμ„±κ°’μ΄ 0에 κ°€μž₯ κ°€κΉŒμš΄ μš©μ•‘μ΄λ‹€. 참고둜, 두 μ’…λ₯˜μ˜ μ•ŒμΉΌλ¦¬μ„± μš©μ•‘λ§ŒμœΌλ‘œλ‚˜ ν˜Ήμ€ 두 μ’…λ₯˜μ˜ μ‚°μ„± μš©μ•‘λ§ŒμœΌλ‘œ νŠΉμ„±κ°’μ΄ 0에 κ°€μž₯ κ°€κΉŒμš΄ ν˜Όν•© μš©μ•‘μ„ λ§Œλ“œλŠ” κ²½μš°λ„ μ‘΄μž¬ν•  수 μžˆλ‹€.

μ‚°μ„± μš©μ•‘κ³Ό μ•ŒμΉΌλ¦¬μ„± μš©μ•‘μ˜ νŠΉμ„±κ°’μ΄ μ •λ ¬λœ μˆœμ„œλ‘œ μ£Όμ–΄μ‘Œμ„ λ•Œ, 이 쀑 두 개의 μ„œλ‘œ λ‹€λ₯Έ μš©μ•‘μ„ ν˜Όν•©ν•˜μ—¬ νŠΉμ„±κ°’μ΄ 0에 κ°€μž₯ κ°€κΉŒμš΄ μš©μ•‘μ„ λ§Œλ“€μ–΄λ‚΄λŠ” 두 μš©μ•‘μ„ μ°ΎλŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 μ€„μ—λŠ” 전체 μš©μ•‘μ˜ 수 N이 μž…λ ₯λœλ‹€. N은 2 이상 100,000 μ΄ν•˜μ˜ μ •μˆ˜μ΄λ‹€. λ‘˜μ§Έ μ€„μ—λŠ” μš©μ•‘μ˜ νŠΉμ„±κ°’μ„ λ‚˜νƒ€λ‚΄λŠ” N개의 μ •μˆ˜κ°€ λΉˆμΉΈμ„ 사이에 두고 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μž…λ ₯되며, 이 μˆ˜λ“€μ€ λͺ¨λ‘ -1,000,000,000 이상 1,000,000,000 μ΄ν•˜μ΄λ‹€. N개의 μš©μ•‘λ“€μ˜ νŠΉμ„±κ°’μ€ λͺ¨λ‘ μ„œλ‘œ λ‹€λ₯΄κ³ , μ‚°μ„± μš©μ•‘λ§ŒμœΌλ‘œλ‚˜ μ•ŒμΉΌλ¦¬μ„± μš©μ•‘λ§ŒμœΌλ‘œ μž…λ ₯이 μ£Όμ–΄μ§€λŠ” κ²½μš°λ„ μžˆμ„ 수 μžˆλ‹€.

좜λ ₯

첫째 쀄에 νŠΉμ„±κ°’μ΄ 0에 κ°€μž₯ κ°€κΉŒμš΄ μš©μ•‘μ„ λ§Œλ“€μ–΄λ‚΄λŠ” 두 μš©μ•‘μ˜ νŠΉμ„±κ°’μ„ 좜λ ₯ν•œλ‹€. 좜λ ₯ν•΄μ•Ό ν•˜λŠ” 두 μš©μ•‘μ€ νŠΉμ„±κ°’μ˜ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ 좜λ ₯ν•œλ‹€. νŠΉμ„±κ°’μ΄ 0에 κ°€μž₯ κ°€κΉŒμš΄ μš©μ•‘μ„ λ§Œλ“€μ–΄λ‚΄λŠ” κ²½μš°κ°€ 두 개 이상일 κ²½μš°μ—λŠ” κ·Έ 쀑 μ•„λ¬΄κ²ƒμ΄λ‚˜ ν•˜λ‚˜λ₯Ό 좜λ ₯ν•œλ‹€.

 

풀이

μ ˆλŒ€κ°’ ν•¨μˆ˜ κΈ°μ–΅ μ•ˆλ‚˜μ„œ κ·Έλƒ₯ κ΅¬ν˜„ν•΄μ„œ 썼닀.

left와 right 인덱슀 λ‘κ°œλ₯Ό μ§€μ •ν•΄μ„œ λ§Œμ‘±ν•˜λŠ” μŒμ„ μ°ΎλŠ” λ¬Έμ œμ΄λ―€λ‘œ νˆ¬ν¬μΈν„°

// 풀이 : https://whkakrkr.tistory.com

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int getAbs(int num) {
    if(num<0) {
        return num*-1;
    }
    return num;
}

int main() {
    int n;
    cin >> n;
    vector<int>v(n);
    for(int i=0; i<n; i++) {
        cin >> v[i];
    }
    
    int left=0, right=n-1;
    int cur = v[left] + v[right];
    pair<int, int> ans = {left, right};
    
    while(left<right) {
        int sum = v[left] + v[right];
        
        if(getAbs(sum) < getAbs(cur)) {
            cur = sum;
            ans = {left, right};
        }
        
        if(sum<0) {
            left++;
        } else {
            right--;
        }
    }
    
    cout << v[ans.first] << " " << v[ans.second];
    
    return 0;
}
λ°˜μ‘ν˜•