[Algo] 합이 0인 네 정수

JJinu·2023년 1월 31일
0

바보같은 실수로 인해 다시 오랜 시간을 소비하여 다시는 이런 실수를 하지 않겠다는 마음가짐으로 적었습니다.

BOJ 7453] 합이 0 인 네 정수 입니다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

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());
        long[][] arr = new long[N][4];


        for(int i=0;i<N;i++){
            String[] str = br.readLine().split(" ");
            for(int j=0;j<4;j++){
                arr[i][j] = Integer.parseInt(str[j]);
            }
        }

        long[] ab = new long[N*N];
        long[] cd = new long[N*N];
        int idx = 0;
        for(int i=0;i<N;i++){
            for(int j=0;j<N;j++){
                ab[idx] = (arr[i][0] + arr[j][1]);
                cd[idx++] = (arr[i][2] + arr[j][3]);
            }
        }

        Arrays.sort(ab);
        Arrays.sort(cd);

        long cnt = 0;
        long sum = 0;

        int i =0;
        int j = cd.length - 1;
        while(i < ab.length && j >= 0){
            sum = ab[i] + cd[j];

            if(sum == 0){
                long AB = ab[i];
                long CD = cd[j];
                long abCnt = 0;
                long cdCnt = 0;

                while(ab[i] == AB && i < ab.length ){
                    abCnt++;
                    i++;
                }
                while(j >= 0 && cd[j] == CD){
                    cdCnt++;
                    j--;
                }
                cnt += abCnt * cdCnt;
            }

            else if(sum > 0) j--;
            else if(sum < 0) i++;
        }
        System.out.println(cnt);

    }
}

투포인터를 이용한 방법으로 풀이를 시도하였고 틀렸던 이유는 while문의 조건 순서로 인하여 ArrayOutOfBounds의 런타임 에러가 발생하였습니다.

디버깅을 돌렸을 때 while(ab[i] == AB && i < ab.length) 에서 i++ 이후 ab[i] == AB를 먼저 조건으로 보고 있었기 때문입니다.

조건을 작성 할 때 순서를 좀 더 신경써서 작성해야 된다는 것을 깨달았던 문제였습니다.

다신 이러한 실수를 하지 말자!

ps) while(i < ab.length && ab[i] == AB ) 로 순서를 바꿔준다면 첫번째 조건에서 탈출하기 때문에 정상적으로 답이 나오는걸 확인 하였습니다. ㅠㅠ

profile
코린이 탈출을 위한 한권의 책

0개의 댓글

관련 채용 정보