1 분 소요

1. 문제

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

  • 그리디 문제
// 문제
하나의 양팔 저울을 이용하여 물건의 무게를 측정하려고 한다.
 저울의  팔의 끝에는 물건이나 추를 올려놓는 접시가 달려 있고,
양팔의 길이는 같다.
또한, 저울의 한쪽에는 저울추들만 놓을  있고,
다른 쪽에는 무게를 측정하려는 물건만 올려놓을  있다.

무게가 양의 정수인 N개의 저울추가 주어질 ,
 추들을 사용하여 측정할  없는 양의 정수 무게 
최솟값을 구하는 프로그램을 작성하시오.

예를 들어, 무게가 각각 3, 1, 6, 2, 7, 30, 1 7개의 저울추가 주어졌을 ,
 추들로 측정할  없는 양의 정수 무게  최솟값은 21이다.

// 입력
  줄에는 저울추의 개수를 나타내는 양의 정수 N이 주어진다.
N은 1 이상 1,000 이하이다.
둘째 줄에는 저울추의 무게를 나타내는 N개의 양의 정수가
빈칸을 사이에 두고 주어진다.
 추의 무게는 1이상 1,000,000 이하이다.

// 출력
첫째 줄에 주어진 추들로 측정할  없는 양의 정수 무게  최솟값을 출력한다.

// 예제 입력 1
7
3 1 6 2 7 30 1

// 예제 출력 1
21


2. 핵심 아이디어

  • 리스트를 sorted로 정렬하여 다음 요소와 비교
  • 모든 배열의 수를 합한 값의 +1이 정답


3. Python 문제풀이

import sys
input = sys.stdin.readline

n, arr = int(input()), sorted(list(map(int, input().split())))

# 만들 수 있는 최소
result = 0

for i in arr :
  if i <= result + 1 :
    result += i
  else :
    break

print(result + 1)


4. Java 문제풀이

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
import java.util.Arrays;

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

    for (int i=0; i<n; i++) {
      arr[i] = Integer.parseInt(st.nextToken());
    }
    Arrays.sort(arr);

    int result = 0;

    for (int i=0; i<n; i++) {
      if (result + 1 < arr[i]) {
        break;
      }
      result += arr[i];
    }

    System.out.println(result + 1);
  }
}

댓글남기기