[λ°±μ€€] 2470 번: 두 μš©μ•‘

2020. 12. 26. 17:19γ†πŸ‘¨πŸ»‍🏫 ν”„λ‘œκ·Έλž˜λ°/BOJ(λ°±μ€€)


문제 링크: [λ°±μ€€] 2470번: λ‘ μš©μ•‘

항상 이뢄탐색과 upper_bound, lower_boundλ₯Ό μ‚¬μš©ν•  λ•Œλ©΄ ν—·κ°ˆλ¦¬λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

λΈ”λ‘œκ·Έμ— ν•œλ²ˆ 정리λ₯Ό ν•΄μ•Όκ² λ‹€λŠ” 생각이 λ“œλ„€μš”.

같이 문제 ν’€μ–΄λ΄…μ‹œλ‹€!




문제

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

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

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

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


μž…μΆœλ ₯


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


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


풀이 & μ½”λ“œ

총 μš©μ•‘μ˜ 개수인 N이 주어지고 각 각의 μš©μ•‘μ€ μŒμˆ˜μ™€ μ–‘μˆ˜μ˜ μ •μˆ˜κ°’μ„ κ°€μ§€κ²Œ λ©λ‹ˆλ‹€. 두 μš©μ•‘μ˜ 합이 0에 κ°€μž₯ κ°€κΉŒμš΄ κ²½μš°μ— κ·Έ 두 μš©μ•‘μ˜ νŠΉμ„±κ°’μ„ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ 좜λ ₯ν•˜λŠ” λ¬Έμ œμ˜€μŠ΅λ‹ˆλ‹€.

이쀑 for문을 μ‚¬μš©ν•˜μ—¬ μš©μ•‘λΌλ¦¬ 1λŒ€1 맀칭할 경우 O(N^2)의 μ‹œκ°„λ³΅μž‘λ„λ‘œ μ‹œκ°„μ΄ˆκ³Όκ°€ λ‚˜κ²Œ λ©λ‹ˆλ‹€. 

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 배열을 sorting ν•œ ν›„ 이뢄탐색법을 μ΄μš©ν•˜μ—¬ νŠΉμ„±κ°’μ˜ 합이 0에 κ°€μž₯ κ°€κΉŒμš΄ μΌ€μ΄μŠ€λ“€μ„ 탐색해 λ³΄μ•˜μŠ΅λ‹ˆλ‹€. 

#include<bits/stdc++.h> using namespace std; const int MAX=100000+1; const int INF=2000000000; int N,l1,l2,liquid[MAX]; int minVal=INF; //νŠΉμ„±κ°’ ν•©μ˜ μ΅œμ†Œκ°’ int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cin>>N; for(int i=0;i<N;i++) cin>>liquid[i]; sort(liquid,liquid+N); for(int i=0;i<N;i++){ int s=0,e=N-1; while(s<=e){ int m=(s+e)/2; if(liquid[i]+liquid[m]==0) { s=m; break; } else if(abs(liquid[i]+liquid[m])>abs(liquid[i]+liquid[m+1])) s=m+1; else{ e=m-1; } } if(s==N) s--; // μ„œλ‘œ λ‹€λ₯Έ 두 μš©μ•‘ s != i if(abs(liquid[i]+liquid[s])<minVal&&s!=i){ minVal=abs(liquid[i]+liquid[s]); l1=min(liquid[i],liquid[s]); l2=max(liquid[i],liquid[s]); } } cout<<l1<<" "<<l2<<"\n"; return 0; }

λΆ€μ‘±ν•œ λΆ€λΆ„μ΄λ‚˜ κΆκΈˆν•œ λΆ€λΆ„ λŒ“κΈ€ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€!.