백준 투포인터 좋은수

정호윤·2023년 3월 20일

자바

목록 보기
41/46

백준문제링크

이상한데서 엄청 애먹고 시간초과 뜬 문제다.왜 시간초과 떴는지는 지금도 모르겠다.

시작과 끝에서 시작하는 투포인터 알고리즘으로 풀면 된다.주의할건 ,합하는 수에 자기 자신이 들어가면 안 된다는 것이다.

수가 같아도 위치가 다르면 다른 숫자로 간주한다.그렇기에 반드시 배열 인덱스로 비교해야 한다.

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

public class Main {
	
	public static void main(String args[]) throws IOException {
        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];

        String str=br.readLine();
        StringTokenizer st = new StringTokenizer(str," ");
        for(int i=0;i<N;i++){
            arr[i]=Integer.parseInt(st.nextToken());
        }
        Arrays.sort(arr);
        int count=0;
        for(int i=0;i<N;i++){
            int start = 0;
            int end = N-1;
            int find=arr[i];

            while(start<end){
              if(arr[start]+arr[end]>find){
                end--;
              }else if(arr[start]+arr[end]<find){
                start++;
              }else{
              // start와 end가 i와 일치하면 안 된다.
                if(start!=i && end!=i){
                    count++;
                    break;
                }else if(start==i){
                    start++;
                }else if(end==i){
                    end--;
                }
              }
            }
        }
        bw.write(String.valueOf(count));
        bw.flush();
        bw.close();
        br.close();
    }
}
profile
개발자로 취직을 희망합니다.

0개의 댓글