베오
DCode
베오
전체 방문자
오늘
어제
  • 분류 전체보기 (218)
    • 공지사항 (1)
    • 잡설 (1)
    • Programming (33)
      • [C] (1)
      • [Java] (4)
      • [Python] (2)
      • [Android] (2)
      • [Network] (0)
      • [Operation System] (2)
      • [Spring Boot] (22)
      • [Docker] (0)
    • Algorithm (31)
      • 자료구조 (2)
      • 알고리즘 (Java) (14)
      • 알고리즘 (기초) (15)
    • Coding Test (131)
      • BOJ (131)
      • Algospat (0)
    • 이론적인거 (14)
      • 보안 (5)
      • 오류 해결 (2)
      • 디자인 패턴 (5)
      • 네트워크 (1)
      • 기타 (1)
    • 최신기술 (4)
      • 블록체인 (1)
    • [Project] (1)

블로그 메뉴

  • 🐈‍⬛ GitHub
  • 📫 방명록
  • 🔖 태그

공지사항

인기 글

티스토리

hELLO · Designed By 정상우.
베오

DCode

Coding Test/BOJ

[BOJ/JAVA] 1744번: 수 묶기

2023. 4. 3. 18:03
1744번: 수 묶기
https://www.acmicpc.net/problem/1744

키워드

길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다.

수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에 상관없이 묶을 수 있다.

수열의 합을 구할 때 묶은 수는 서로 곱한 후에 더한다.


구현

  • 양수의 경우 큰 것 끼리 곱하면 더욱 커지므로 무조건 묶어준다.
  • 음수의 경우 작은 것 끼리 곱하면 더욱 커지므로 무조건 묶어준다.
  • 1의 경우 곱하면 더 작아지므로 더해준다.
  • 음수의 갯수가 홀수개 이고, 0이 존재한다면 가장 큰 음수와 0을 묶어준다.

코드

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

public class java_1744 {
    static int N;

    static PriorityQueue<Integer> positiveQueue, negativeQueue;

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

        // N개의 수를 정렬한 후
        // 높은 수는 무조건 곱하자. (양수끼리는 큰 것 우선으로 곱하자)
        // 음수끼리는 무조건 곱하자. (음수끼리는 작은 것 우선으로 곱하자)
        N = Integer.parseInt(br.readLine());

        positiveQueue = new PriorityQueue<>((o1, o2) -> o2 - o1);
        negativeQueue = new PriorityQueue<>((o1, o2) -> o1 - o2);

        // 음수의 갯수가 홀수일 때 쓰일 예정
        boolean isZero = false;
        int result = 0;

        for (int i = 0; i < N; i++) {
            int number = Integer.parseInt(br.readLine());

            // 0 추가
            if (number == 0) {
                isZero = true;
                continue;
            }

            // 1은 더하는게 이득이므로 가산
            if (number == 1) {
                result++;
                continue;
            }

            // 양수 추가
            if (number > 0) {
                positiveQueue.add(number);
                continue;
            }

            // 음수 추가
            if (number < 0) {
                negativeQueue.add(number);
                continue;
            }
        }

        result += solution(isZero);

        System.out.println(result);

        br.close();
    }

    private static int solution(boolean isZero) {
        int result = 0;

        // 양수 계산하기
        while (!positiveQueue.isEmpty()) {
            // 1개만 남은 경우
            if (positiveQueue.size() == 1) {
                result += positiveQueue.poll();
                continue;
            }

            // 두 수 확인하기
            int a = positiveQueue.poll();
            int b = positiveQueue.poll();
            result += a * b;
        }

        // 음수 계산하기
        while (!negativeQueue.isEmpty()) {
            // 1개만 남은 경우
            if (negativeQueue.size() == 1) {
                // zero가 있는 경우 -> 0이랑 곱함
                if (isZero) {
                    negativeQueue.poll();
                    continue;
                }
                // zero 가 없는 경우 -> 그냥 더하기
                result += negativeQueue.poll();
                continue;
            }

            // 두 수 확인하기
            int a = negativeQueue.poll();
            int b = negativeQueue.poll();
            result += a * b;
        }

        return result;
    }
}


Uploaded by N2T

'Coding Test > BOJ' 카테고리의 다른 글

[BOJ/JAVA] 23559번: 밥  (0) 2023.04.03
[BOJ/JAVA] 27313번: 효율적인 애니메이션 감상  (0) 2023.04.03
[BOJ/JAVA] 1198번: 삼각형으로 자르기  (0) 2023.04.03
[BOJ/JAVA] 1711번: 직각삼각형  (0) 2023.04.03
[BOJ/JAVA] 11758번: CCW  (0) 2023.04.03
    'Coding Test/BOJ' 카테고리의 다른 글
    • [BOJ/JAVA] 23559번: 밥
    • [BOJ/JAVA] 27313번: 효율적인 애니메이션 감상
    • [BOJ/JAVA] 1198번: 삼각형으로 자르기
    • [BOJ/JAVA] 1711번: 직각삼각형
    베오
    베오

    티스토리툴바