[백준] 1744번 수 묶기 JAVA 풀이

권용환·2021년 9월 1일
0

백준

목록 보기
5/36
post-thumbnail

문제 바로가기

나의 풀이

쉬운 그리디 문제였지만 조건문의 분기를 확실하게 해야한다. 또한 for문에서 인덱스 bound를 잘 생각해야한다.

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

class Main {

    static int[] arr;
    static int ans = 0;

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = Integer.parseInt(br.readLine());
        }

        // 오름차순으로 정리해준다
        Arrays.sort(arr);
        // 아래의 for 문에서는 음수 처리를 해줄 것이다
        for (int i = 0; i < arr.length; i++) {
            // 시작부터 0이상이면 바로 break
            if (arr[i] >= 0) {
                break;
            }
            // 2개씩 계산해줘야 하므로 인덱스 오류가 나지않게 마지막 인덱스값인지 아닌지 확인한다
            if (i < arr.length - 1) {
                // 음수는 둘다 음수거나, 각각 음수와 0 일때는 곱해야 한다
                if (arr[i] < 0 && arr[i + 1] <= 0) {
                    ans += arr[i] * arr[i + 1];
                    i++;
                // 위의 if 문의 조건식을 보자, 여기 걸리면 arr[i+1]은 양수값을 가지므로 break
                } else if (arr[i] < 0) {
                    ans += arr[i];
                    break;
                // 위의 if 문 모두 걸리지 않으면 시작부터 0이상이라는 말인데 혹시 몰라 예외처리 느낌으로 넣었다
                } else {
                    break;
                }
            // i가 마지막 인덱스이면 그 값만 비교해야한다
            // 이 for 문에서는 음수 값만 처리해주기로 했다
            } else {
                if (i == arr.length - 1 && arr[i] < 0) {
                    ans += arr[i];
                    break;
                }
            }
        }

        // 양수 값만 처리해주는 for 문이다
        for (int i = arr.length - 1; i >= 0; i--) {
            // 시작부터 0 이하면 break
            if (arr[i] <= 0) {
                break;
            }
            // 인덱스가 0일때는 그 다음 값과 생각 못하므로 분기한다
            if (i > 0) {
                // 둘다 1보다 크면 무조건 곱해야한다
                if (arr[i] > 1 && arr[i - 1] > 1) {
                    ans += arr[i] * arr[i - 1];
                    i--;
                // 위의 if 문과 비교해보자 
                // arr[i]가 1 초과라면 arr[i-1] == 1 이므로 각자 더해줘야한다
                // arr[i] == 1 이라면 각자 더해줘야한다
                } else if (arr[i] >= 1) {
                    ans += arr[i];
                    continue;
                // 혹시 모를 예외처리
                } else {
                    break;
                }
            // i 가 마지막 인덱스이면 그 값만 양수인지 확인하고 더해준다
            } else {
                if (i == 0 && arr[i] > 0) {
                    ans += arr[i];
                    break;
                }
            }
        }

        System.out.println(ans);
    }
}
profile
마구 낙서하는 블로그입니다

0개의 댓글