[백준] 1744번 수 묶기 Java

JeongYong·2022년 11월 22일
0

Algorithm

목록 보기
73/275

문제 링크

https://www.acmicpc.net/problem/1744

문제

길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에 상관없이 묶을 수 있다. 하지만, 같은 위치에 있는 수(자기 자신)를 묶는 것은 불가능하다. 그리고 어떤 수를 묶게 되면, 수열의 합을 구할 때 묶은 수는 서로 곱한 후에 더한다.

예를 들면, 어떤 수열이 {0, 1, 2, 4, 3, 5}일 때, 그냥 이 수열의 합을 구하면 0+1+2+4+3+5 = 15이다. 하지만, 2와 3을 묶고, 4와 5를 묶게 되면, 0+1+(23)+(45) = 27이 되어 최대가 된다.

수열의 모든 수는 단 한번만 묶거나, 아니면 묶지 않아야한다.

수열이 주어졌을 때, 수열의 각 수를 적절히 묶었을 때, 그 합이 최대가 되게 하는 프로그램을 작성하시오.

입력

첫째 줄에 수열의 크기 N이 주어진다. N은 50보다 작은 자연수이다. 둘째 줄부터 N개의 줄에 수열의 각 수가 주어진다. 수열의 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.

출력

수를 합이 최대가 나오게 묶었을 때 합을 출력한다. 정답은 항상 231보다 작다.

알고리즘: 그리디

풀이

주어진 수열을 두 가지로 나눈다.

  1. 0 제외 양수 값
  2. 0 포함 음수값

1번은 내림차순으로 정렬하고 값이 큰 수부터 2개씩 묶는다.
2개 중 하나라도 1 값이 있다면 + 해주고 그게 아니라면 * 해준다.
홀수인 경우는 마지막 하나가 남기 때문에 ans에 + 해준다.

2번은 오름차순으로 정렬하고 값이 작은 수부터 2개씩 묶는다.
음수 음수는 + 이기 때문에 연산해준다.
홀수인 경우는 마지막 하나가 남기 때문에 ans에 + 해준다.

소스 코드

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

public class Main {
    static ArrayList<Integer> ngtive = new ArrayList<>();
    static ArrayList<Integer> pstive = new ArrayList<>();
    static int N;
    static long ans = 0;
    public static void main(String args[]) throws IOException {
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      N = Integer.parseInt(br.readLine());
      for(int i=0; i<N; i++) {
          int n = Integer.parseInt(br.readLine());
          if(n>0) {
              pstive.add(n);
          } else {
              ngtive.add(n);
          }
      }
      Collections.sort(pstive, Collections.reverseOrder());
      Collections.sort(ngtive);
      
      for(int i=0; i<pstive.size(); i++) {
          if(pstive.size()%2 == 1 && i == pstive.size() - 1) {
              ans += pstive.get(i);
          } else if(i % 2 == 1) {
              if(pstive.get(i-1) != 1 && pstive.get(i) != 1) {
                  ans += pstive.get(i-1) * pstive.get(i);
              } else {
                  ans += pstive.get(i-1) + pstive.get(i);
              }
          }
      }
      
      for(int i=0; i<ngtive.size(); i++) {
          if(ngtive.size()%2 == 1 && i == ngtive.size() - 1) {
              ans += ngtive.get(i);
          } else if(i % 2 == 1) {
              ans += ngtive.get(i-1) * ngtive.get(i);
          }
      }
      System.out.println(ans);
    }
}

0개의 댓글