알고리즘/백준

[Java] 백준 1744 수 묶기 - 골드4

fladi 2023. 7. 14. 05:50
728x90

 

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

 

1744번: 수 묶기

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

www.acmicpc.net

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;


public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int cnt = Integer.parseInt(br.readLine().strip());

    List<Integer> list = new ArrayList<>();
    for (int i=0; i<cnt; i++)
      list.add(Integer.parseInt(br.readLine().strip()));

    //개수가 1일 때 처리
    if (cnt == 1){
      System.out.println(list.get(0));
      return;
    }

    Collections.sort(list);

    int sum = 0;

    //[음의 정수 + 0] 처리
    for (int i=0; i<cnt; i++) {
      if (i >= cnt-1)
        break;

      int a = list.get(i);
      int b = list.get(i+1);

      if (a > 0 || b > 0)
        break;

      sum += a*b;
      list.set(i, 0); list.set(i+1, 0);
      i++;
    }

    //양의 정수 처리
    for (int i=list.size()-1; i>=0; i--) {
      if (i < 1)
        break;

      int a = list.get(i);
      int b = list.get(i-1);

      if (a <=1 || b <= 1)
        break;

      sum += a*b;
      list.set(i, 0); list.set(i-1, 0);
      i--;
    }

    for (Integer i: list)
      sum += i;

    System.out.println(sum);
  }
}
  • 입력 개수가 1일 때는 그대로 반환하도록 해줌
  • 오름차순으로 정렬해준다
  • 음의 정수와 0일 때 처리를 해준다
    • 둘 다 음수거나 0인 경우 곱해서 sum에 더해준다
    • 나중에 남은 값들을 더해줄거라서 곱한 값들의 자리에는 0을 넣어준다
  • 자연수일 때 처리를 해준다
    • 1인 경우에는 곱하면 안됨
    • 그러므로 둘 다 1이상인 경우 곱해서 sum에 더해준다
    • 하나라도 1인 게 포함되어 있으면 그냥 break한다
  • sum에 곱해진 값들과 나머지 값들을 긁어모아서 print 해준다

 

 

 

 

 

어우 너무 힘들었따

 

 

 

728x90