[백준] 수 묶기 1744번 - Java

[백준] 수 묶기 1744번

나의 풀이

public class TieANumber {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        List<Integer> gtZero = new ArrayList<>();
        List<Integer> ltZero = new ArrayList<>();
        for(int i = 0; i < N; i++) {
            int item = Integer.parseInt(br.readLine());
            if(item > 0) {
                gtZero.add(item);
            } else {
                ltZero.add(item);
            }
        }

        Collections.sort(ltZero);
        Collections.sort(gtZero, Collections.reverseOrder());

        int answer = 0;
        int idx = ltZero.size();
        if(ltZero.size() % 2 != 0) {
            answer += ltZero.get(idx - 1);
            idx -= 1;
        }
        for(int i = 0; i < idx; i += 2) {
            answer += (ltZero.get(i) * ltZero.get(i + 1));
        }

        idx = gtZero.size();
        if(gtZero.size() % 2 != 0) {
            answer += gtZero.get(idx - 1);
            idx -= 1;
        }
        for(int i = 0; i < idx; i += 2) {
            if(gtZero.get(i) > 1 && gtZero.get(i + 1) > 1) {
                answer += (gtZero.get(i) * gtZero.get(i + 1));
            } else if(gtZero.get(i) >= 1 || gtZero.get(i + 1) >= 1) {
                answer += (gtZero.get(i) + gtZero.get(i + 1));
            }
        }

        System.out.println(answer);
    }
}
  • 입력되는 수를 0보다 큰 수, 0과 같거나 작은 수 그룹으로 나눠서 접근하였다.
  • 리스트를 두 개 만들어서 각 각 0보다 큰 수, 0과 같거나 작은 수를 구분하여 담아준다.
  • 우선 계산을 쉽게 하기 위해서 0보다 큰 수의 리스트는 내림차순 정렬을 하였고, 0과 같거나 작은 수 리스트는 오름차순 정렬을 하였다.
  • 먼저 0과 같거나 작은 수 그룹을 계산하였다. 만약 사이즈가 홀수라면 2개씩 짝을 지었을 때 1개가 남기 때문에 마지막 남는 한개는 미리 answer에 더해 주고, 인덱스를 사이즈 - 1로 잡고 반복을 진행하였다.
  • 0과 같거나 작은 수의 그룹은 어떻게 하든지 곱하는 것이 제일 큰 수를 만들 수 있는 방법이다.
    ex) (-2 + -1) -> -3 but (-2 * -1) -> 2, (-1 + 0) -> -1 but (-1 * 0) -> 0
    그렇기 때문에 인덱스를 2씩 증가시키며 그룹을 만들어 곱한 수를 answer에 더해주었다.
  • 0보다 큰 수도 마찬가지로 사이즈가 홀수라면 1개가 남기 때문에 인덱스 작업을 해주고, 내림차순으로 정렬을 미리 했기 때문에 0부터 반복을 한다.
  • 0보다 큰 수같은 경우는 둘 중 하나라도 1이 들어간다면, 곱하는 것보다는 더하는 것이 더 큰 값을 만들 수 있는 방법이다.
    ex) (1 * 2) -> 2 but (1 + 2) -> 3
    그렇기 때문에 둘 다 1보다 큰 경우에만 곱해서 answer에 더해주고, 둘 중 하나라도 1보다 크거나 같다면 두 수를 더해서 answer 에 더해준다.
  • 모든 작업을 끝내고 answer를 출력해준다.

좋은 웹페이지 즐겨찾기