1253번 좋다 (Java)

Date:    Updated:

카테고리:

문제 설명

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

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

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

제한 조건

  • 시간제한 : 2초
  • 메모리제한 : 256MB

입력 설명

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

출력 설명

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

예제 입력 및 출력1

10
1 2 3 4 5 6 7 8 9 10

8

나의 풀이

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

public class Main {
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int numberLength = Integer.parseInt(br.readLine());
        long[] numbersArr = new long[numberLength];
        
        StringTokenizer st = new StringTokenizer(br.readLine());
        
        for(int i=0; i<numberLength; i++){
            numbersArr[i] = Long.parseLong(st.nextToken());
        }
        
        Arrays.sort(numbersArr);
        
        int count = 0;
        for(int k=0; k<numberLength; k++){
            long targetNum = numbersArr[k];
            int startIdx = 0;
            int endIdx = numberLength-1;
            while(startIdx < endIdx){
                if(numbersArr[startIdx] + numbersArr[endIdx] > targetNum){
                    endIdx--; 
                } else if(numbersArr[startIdx] + numbersArr[endIdx] < targetNum){
                    startIdx++;
                } else {
                    // 값이 맞을 때
                    // "다른 두 수"의 합이므로 서로 값이 같을 수 없음
                    // 또한 자기 자신(targetNum)을 포함하면 안됨
                    if(startIdx != k && endIdx != k){
                        // 자기 자신을 포함하지 않으며 두 수가 다름 (조건 충족)
                        count++;
                        break;
                    } else if (startIdx == k){
                        // 자기 자신은 포함하면 안되니 인덱스 증감 후 다음 루프 진행
                        startIdx++;
                    } else if (endIdx == k) {
                        // 자기 자신은 포함하면 안되니 인덱스 증감 후 다음 루프 진행
                        endIdx--;
                    }
                }
            }
        }
        
        System.out.println(count);
        br.close();
    }
}

댓글남기기