끄적끄적 코딩
article thumbnail
Published 2023. 7. 3. 00:23
[Java] 백준 1253번 좋다 알고리즘

투포인터 문제입니다.

N개의 수가 있을 때 좋은 수의 개수를 찾아야합니다.
좋은 수는 해당 수를 제외한 2개의 수의 합으로 만들어질 경우 좋은 수라고 합니다.

입력받은 수의 배열을 정렬해줍니다.
for문을 통해서 차례대로 좋은수인지 체크합니다.

투포인터로 두 개의 합을 구하고 값이 클 경우 right -1, 값이 작을 경우 left + 1 을 해줍니다.
만약 두 개의 값이 같은 경우 찾는 수와 인덱스가 같은지 확인해주고 둘 다 다를 경우 좋은 수로 카운팅해줍니다.

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.StringTokenizer;

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 index = 0;
    int result = 0;

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

    Arrays.sort(arr);
    for (int i = 0; i < n; ++i) {
      int findNum = arr[i];
      int left = 0;
      int right = n - 1;
      int sum = 0;

      while (left < right) {
        sum = arr[left] + arr[right];
        if (sum == findNum) {
          if (i == left) {
            ++left;
          } else if (right == i) {
            --right;
          } else {
            ++result;
            break;
          }
        }

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

    bw.write(result + "\n");
    bw.close();
  }
}

 

'알고리즘' 카테고리의 다른 글

[Java] 백준 9663번 N-Queen  (0) 2023.07.04
[Java] 백준 1013번 Contact  (0) 2023.07.03
[Java] 백준 2310번 어드벤처 게임  (0) 2023.07.01
[Java] 백준 1043번 거짓말  (0) 2023.06.30
[Java] 백준 2225번 합분해  (0) 2023.06.29

검색 태그