알고리즘/BOJ

[BOJ] 1744. 수 묶기

재담 2022. 3. 20. 22:53

문제 원본 : https://www.acmicpc.net/problem/1744

 

1744번: 수 묶기

길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에

www.acmicpc.net

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

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

        Arrays.sort(arr);

        int ans = 0;
        int idx1 = n, idx2 = -1;
        for (int i = 0; i < n - 1; i += 2) {
            if (arr[i] > 0 || arr[i + 1] > 0) {
                idx1 = i;
                break;
            }

            ans += (arr[i] * arr[i + 1]);
        }

        if (n % 2 == 1 && idx1 == n && arr[n - 1] < 0) {
            ans += arr[n - 1];
        }

        if (idx1 < n && arr[idx1] < 0) {
            ans += arr[idx1];
        }

        for (int i = n - 1; i > 0; i -= 2) {
            if (arr[i] <= 0 || arr[i - 1] <= 0) {
                idx2 = i;
                break;
            }

            if (arr[i] * arr[i - 1] > arr[i] + arr[i - 1]) {
                ans += (arr[i] * arr[i - 1]);
            } else {
                ans += (arr[i] + arr[i - 1]);
            }
        }

        if (n % 2 == 1 && idx2 == -1 && arr[0] > 0) {
            ans += arr[0];
        }

        if (idx2 >= 0 && arr[idx2] > 0) {
            ans += arr[idx2];
        }

        bw.write(String.valueOf(ans));

        bw.close();
        br.close();
    }
}
  • 정렬 문제
  • 로직이 꼬이면 반례 지옥인 문제인 듯...
  • 다른 사람들의 풀이를 보니 훨씬 간단한 로직이 가능해 보이는데
  • 내 머리로는 이게 한계
  • 0은 음수랑은 곱해야 하고 양수랑은 더해야 하고,
  • 1은 묶지 말고 더해야 해서 너무 헷갈렸다.

'알고리즘 > BOJ' 카테고리의 다른 글

[BOJ] 10830. 행렬 제곱  (0) 2022.03.22
[BOJ] 1271. 엄청난 부자2  (0) 2022.03.21
[BOJ] 18870. 좌표 압축  (0) 2022.03.19
[BOJ] 11049. 행렬 곱셈 순서  (0) 2022.03.18
[BOJ] 2629. 양팔저울  (0) 2022.03.17