Java 문제풀이 - 좋은 수

Minseol·2023년 3월 8일
0

문제

N개의 수 중에서 어떤 수가 다른 수 두 개의 합으로 나타낼 수 있다면 그 수를 “좋다(GOOD)”고 한다.

N개의 수가 주어지면 그 중에서 좋은 수의 개수는 몇 개인지 출력하라.

수의 위치가 다르면 값이 같아도 다른 수이다.

입력

첫째 줄에는 수의 개수 N(1 ≤ N ≤ 2,000), 두 번째 줄에는 i번째 수를 나타내는 Ai가 N개 주어진다. (|Ai| ≤ 1,000,000,000, Ai는 정수)

출력

좋은 수의 개수를 첫 번째 줄에 출력한다.

예제 입/출력

나의 풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(bf.readLine());
        long[] inputArr = new long[N];
        StringTokenizer st = new StringTokenizer(bf.readLine());

        for (int i = 0; i < N; i++) {
            inputArr[i] = Long.parseLong(st.nextToken());
        }

        Arrays.sort(inputArr);
        int count = 0;

        for (int i = 0; i < N; i++) {
            int leftIndex = 0;
            int rightIndex = N - 1;
            long find = inputArr[i];
            long sum;

            while (leftIndex < rightIndex) {
                sum = inputArr[leftIndex] + inputArr[rightIndex];
                if (sum == find) {
                     if (leftIndex != i && rightIndex != i) {
                         count++;
                         break;
                     } else if (leftIndex == i) {
                         leftIndex++;
                     } else if (rightIndex == i) {
                         rightIndex--;
                     }
                 } else if (sum > find) {
                     rightIndex--;
                 } else if (sum < find) {
                     leftIndex++;
                 }
            }
        }
        System.out.println(count);
    }
}

예시 풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class P1253_좋은수 {
  public static void main(String[] args) throws NumberFormatException, IOException {
    BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
    int N = Integer.parseInt(bf.readLine());
    int Result = 0;
    long A[] = new long[N];
    StringTokenizer st = new StringTokenizer(bf.readLine());
    for (int i = 0; i < N; i++) {
      A[i] = Long.parseLong(st.nextToken());
    }
    Arrays.sort(A);
    for (int k = 0; k < N; k++) {
      long find = A[k];
      int i = 0;
      int j = N - 1;
      while (i < j) {  // 투포인터 알고리즘 
        if (A[i] + A[j] == find) {
          // find는 서로 다른 두 수의 합이여야됨을 체크
          if (i != k && j != k) {
            Result++;
            break;
          } else if (i == k) {
            i++;
          } else if (j == k) {
            j--;
          }
        } else if (A[i] + A[j] < find) {
          i++;
        } else {
          j--;
        }
      }
    }
    System.out.println(Result);
    bf.close();
  }
}

리뷰

문제 조건을 제대로 읽지 않아서 매우 오랜 시간이 걸렸다. 제발 문제 조건 (특히 숫자 범위) 제대로 읽고 풀자....

profile
귀여운 설이에양

0개의 댓글

Powered by GraphCDN, the GraphQL CDN