상세 컨텐츠

본문 제목

[백준 JAVA] 1253번 좋다 문제

백준 자바

by 빙하둘리 2023. 1. 28. 22:05

본문

728x90

스킬 뜯어쓰기로 입출력 반복해서 외우고 투 포인터 이동원칙 외우기!

import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        // 한 줄에 숫자 하나 받는 스킬
        int N=Integer.parseInt(br.readLine());

        int result = 0;
        // 1차원 배열 입력 받기 코드
        
        //들어오는 테스트 케이스는 정수! (이게 가장 중요!)
        int A[]=new int[N];
        StringTokenizer st = new StringTokenizer(br.readLine());
        for(int i=0; i<N; i++){
            A[i]=Integer.parseInt(st.nextToken());
        }

        // 배열 정렬 코드
        Arrays.sort(A);

        for(int k=0; k<N; k++){ // for문 한번 당 숫자 하나에 대해 좋은 수 판단
            long find = A[k];
            // 그러므로 다음과 같이 투포인터를 초기화 해야한다.
            // 왜 아래와 같이 초기화해야되나? 주몽 문제 참고!
            int i=0;
            int j=N-1;

            while(i<j){
                // 투포인터 이동 원칙에 따라 i와 j를 늘릴건데,,,
                // 탈출 조건은 어떻게 해줘야 하나?
                // 투포인터 조건 1,2,3
                if(A[i]+A[j]==find){ // 투포인터 조건1
                   // 조건1의 세부 조건 뜯기

                    if(i!=k && j!=k){ //(-5 0), (0, 4) 같은 조건은 좋은수가 아니어서
                        result++;
                        break; // 이 때 좋은 수 뽑는 조건인 이유?
                    }
                    else if(i==k){
                        i++;
                    }
                    else if(j==k){ // 수가 본인일 때
                        j--;
                    }
                }
                else if (A[i]+A[j]<find) // 투포인터 조건2
                {
                    i++;
                }
                else { // 투포인터 조건3
                    j--;
                }
            }
        }

        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
        bw.write(String.valueOf(result));

        bw.flush();
        bw.close();
    }
}
728x90

관련글 더보기

댓글 영역