끄적끄적 코딩
article thumbnail
Published 2023. 7. 24. 21:33
[Java] 백준 2467번 용액 알고리즘

투포인터 문제입니다.

두개의 숫자를 더해서 가장 0과 가까운 수를 만들 수 있는 값들을 구해야합니다.
투포인터를 이용해서 맨왼쪽과 맨오른쪽에 포인터를 지정합니다.

1. 두개의 합이 0보다 크면 오른쪽을 왼쪽으로 한칸 이동
2. 두개의 합이 0보다 작으면 왼쪽을 오른쪽으로 한칸 이동

위의 과정을 반복하면서 합을 구해줍니다.

가장 작은 합을 가진 경우에 왼쪽 오른쪽의 위치의 값을 출력해줍니다.

import java.io.*;
import java.util.*;

public class Main {
  public static void main(String[] args) throws Exception {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

    int n = Integer.parseInt(br.readLine());
    int[] arr = new int[n];
    int goodSum = 2_000_000_001;
    int goodLeft = 0;
    int goodRight = 0;

    StringTokenizer st = new StringTokenizer(br.readLine());
    for (int i = 0; i < n; ++i) {
      arr[i] = Integer.parseInt(st.nextToken());
    }

    int left = 0;
    int right = n - 1;
    while (left < right) {
      int sum = Math.abs(arr[left] + arr[right]);
      if (goodSum > sum) {
        goodSum = sum;
        goodLeft = left;
        goodRight = right;
      }

      if (arr[left] + arr[right] > 0) {
        --right;
      } else {
        ++left;
      }
    }

    bw.write(arr[goodLeft] + " " + arr[goodRight] + "\n");
    bw.close();
  }
}

검색 태그