백준 3151 합이 0

김준영·2023년 5월 9일
1

코딩테스트

목록 보기
20/22


public class boj3151 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());

        int[] arr = new int[n];

        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 0; i < n; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }

        Arrays.sort(arr);
        long answer = 0;
        for (int i = 0; i < n; i++) {
            if(arr[i] > 0) break;
            int str = i + 1;
            int en = n - 1;

            while(str < en){
                int s = 1;
                int e = 1;
                int c = arr[i] + arr[str] + arr[en];
                if (c == 0) {
                    if (arr[str] == arr[en]) {
                        answer += comb(en - str + 1);
                        break;
                    }

                    while (str + 1 < en && arr[str] == arr[str + 1]) {
                        s++;
                        str++;
                    }

                    while (str < en - 1 && arr[en] == arr[en - 1]) {
                        e++;
                        en--;
                    }

                    answer += s * e;
                }
                if (c > 0) {
                    en--;
                }else
                    str++;
            }
        }
        System.out.println(answer);


    }

    static int comb(int i) {
        return i * (i - 1) / 2;
    }
}
  • 학생들을 오름차순으로 정렬한다.
  • 0번째 인덱스를 기준으로 다음 값을 start, 끝 값을 end로 두고 이분 탐색.
    • 0번째 인덱스가 0 보다 크면 start + end + 0번째 인덱스가 무조건 0이상이므로 반복문 탈출.
  • start + end + 0번째 인덱스를 더한 값이 0이면
    • start값과 end값이 같으면 nC2를 사용한다. ex> [-10, 5, 5, 5, 5]
    • start+1이 end보다 작으면서 값이 같으면 s++, start++
    • end-1이 start보다 크고 값이 같으면 e—, end++
    • answer += e * s;를 한다. ex> [-12, 5, 5, 5, 5, 0, 0, 7, 7, 7] ⇒ s = 4, e = 3
  • start + end + 0번째 인덱스를 더한 값이 0보다 크거나 작으면 start++, end— 를 진행한다.
profile
ㅎㅎ

0개의 댓글