λ°±μ€ 2467 - μ©μ‘ (μ΄λΆνμ, ν¬ν¬μΈν°)
ππ λ보기λ₯Ό λλ₯΄μλ©΄ λ¬Έμ λ§ν¬λ₯Ό νμΈνμ€ μ μμ΅λλ€.
λ¬Έμ μμ½
- μ°μ± μ©μ‘κ³Ό μμΉΌλ¦¬μ± μ©μ‘μ νΉμ±κ°μ΄ μ λ ¬λ μμλ‘ μ£Όμ΄μ§λ€.
- μ΄ μ€ λ κ°μ μλ‘ λ€λ₯Έ μ©μ‘μ νΌν©νμ¬ νΉμ±κ°μ΄ 0μ κ°κΉμ΄ μ©μ‘μ λ§λ€μ΄ λ΄λ λ μ©μ‘μ μΆλ ₯νλΌ.
* νΌν©ν μ©μ‘μ νΉμ±κ°: νΌν©μ μ¬μ©λ κ° μ©μ‘μ νΉμ±κ°μ ν©
μ ν 쑰건
- μ 체 μ©μ‘μ μ (2≤ N ≤ 100,000)
(100,000 κ°μ§ μ€ 2κ°μ§ κ²½μ°μ μλ₯Ό μ°ΎμΌλ©΄ κ²½μ°μ μκ° μλΉν λ§μμ Έ 1μ΄λ§μ λ¬Έμ λ₯Ό νκΈ°μ λ¬΄λ¦¬κ° μλ€.)
- μ©μ‘μ νΉμ± κ° (-1,000,000,000 ≤ M ≤ 1,000,000,000) (Long νμ )
μμ΄λμ΄
- Two pointer (μΌμͺ½ μΈλ±μ€, μ€λ₯Έμͺ½ μΈλ±μ€)
- μΌμͺ½ μΈλ±μ€κ° κ°λ¦¬ν€λ νΉμ± κ°κ³Ό μ€λ₯Έμͺ½ μΈλ±μ€κ° κ°λ¦¬ν€λ νΉμ± κ°μ ν©μ΄ 0λ³΄λ€ μμΌλ©΄ μΌμͺ½ μΈλ±μ€ κ° μ¦κ°
β΅ (μΌμͺ½ μΈλ±μ€κ° κ°λ¦¬ν€λ κ° + μ€λ₯Έμͺ½ μΈλ±μ€κ° κ°λ¦¬ν€λ κ°)μ μ λκ°μ΄ 0μ κ°κΉμ μ ΈμΌνκΈ° λλ¬Έμ
- νΉμ± κ°μ ν©μ΄ 0λ³΄λ€ ν¬λ©΄ μ€λ₯Έμͺ½ μΈλ±μ€μ κ°μ΄ λ ν¬λ―λ‘ μ€λ₯Έμͺ½ μΈλ±μ€ κ° κ°μ
- λ νΉμ± κ°μ ν© μ λκ°μ΄ 0μ κ°μ₯ κ°κΉμ΄ λ μ μΆλ ₯
β΅ νΉμ± κ°μ ν©μ μ λκ°μ μ·¨νλ μ΄μ λ μμ κ°κ³Ό μμ κ°μ μκ΄ μμ΄ 0μ κ°κΉμ΄ μμΉνλ μλ₯Ό μ°ΎκΈ° μν΄μλ€.
μ½λ (Java)
import java.util.Scanner;
public class BS_boj_2467 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
long[] items = new long[N];
for (int i = 0; i < N; i++) {
items[i] = sc.nextLong();
}
// 1. μ λ ¬ (νμ XX) - μ΄λ―Έ μ€λ¦μ°¨μμΌλ‘ μ
λ ₯μ΄ μ£Όμ΄μ§λ€.
int left = 0; // λ°°μ΄ μΌμͺ½ λ index
int right = N - 1; // λ°°μ΄ μ€λ₯Έμͺ½ λ index
long ans1 = 0, ans2 = 0; // μΆλ ₯ν λ μ
long min = Integer.MAX_VALUE; // 0μ κ°κΉμ΄ κ° (μ λκ°)
// 2. μ΄λΆνμ
// leftκ° μ»€μ§κ³ rightκ° μ€μ΄λ€λ€λ³΄λ©΄ left == rightκ° κ°μμ§λ μκ°μ΄ μ¨λ€.
// leftμ rightκ° κ°μμ§ κ²½μ° κ°μ μλ₯Ό κ°λ¦¬ν€λ κ²μ μλ―ΈνκΈ° λλ¬Έμ
// left <= right κ° μλ, left < right κ° λμ΄μΌ νλ€.
while (left < right) {
long sum = items[left] + items[right]; // λ μΈλ±μ€μ ν©
if (min > Math.abs(sum)) {
// μ λκ°μ μ΄μ©νμ§ μμΌλ©΄, minμ -κ° λ μ μλ€.
// -λ +λ 0μ κ°κΉμ΄ κ°μ μ°Ύλ κ²μ΄λ―λ‘ μ λκ°μ μ·¨ν΄μ€λ€.
min = Math.abs(sum);
ans1 = items[left];
ans2 = items[right];
}
// sumμ΄ 0λ³΄λ€ μμλ€λ κ²μ μΌμͺ½ κ°μ΄ μ€λ₯Έμͺ½ κ°λ³΄λ€ μ λκ°μ μ·¨νμ λ ν¬λ€λ κ²μ μλ―Ένλ€.
// μΌμͺ½μ μ¦κ°μμΌ sumμ μλ₯Ό μ€μΈλ€.
if (sum < 0)
left++;
else
right--;
// sumμ΄ 0λ³΄λ€ ν¬λ€λ κ²μ μ€λ₯Έμͺ½ κ°μ΄ μΌμͺ½ κ°λ³΄λ€ μ λκ°μ μ·¨νμ λ ν¬λ€λ κ²μ μλ―Ένλ€.
// μ€λ₯Έμͺ½μ κ°μμμΌ sumμ μλ₯Ό μ€μΈλ€. (sumμ μλ₯Ό μ€μ¬μΌ 0μ κ°κΉμ΄ κ°μ μ°Ύμ μ μλ€.)
}
System.out.println(ans1 + " " + ans2);
}
}