제이슨의 개발이야기

백준2437번저울 코틀린 그리디 알고리즘 본문

코딩테스트

백준2437번저울 코틀린 그리디 알고리즘

제이쓰은 2021. 9. 28. 18:05
728x90
반응형

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

 

2437번: 저울

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

www.acmicpc.net

 

요번에는 바로 저울 문제를 풀어봤습니다!

문제

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

무게가 양의 정수인 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

 


저는 문제 접근 하는 방법을 

 

1kg부터 쭉 무개를 재다가 무개가 잴 수 없는 무개 일 경우 println() 으로 출력했습니다

무개를 재는 방법은 가지고 있는 추의 무개만큼 빼 보면서 0보다 작아지는 경우 와

가지고 있는 추를 다 뺐는대 여전히 0보다 클 경우 

가지고 있는 추로는 무개를 잴 수 없다는 결론 을 냈습니다! 

그러나 무작정 가지고 있는 추의 무개로 뺴는 것이 아니라 

 

먼저 추의 배열을 정렬 한 다음 

 

배열의 끝에서부터 시작해서 (가장 무거운 추 부터 ) 비교하다가

 

추의 무개가 무개를 재려는 대상보다 가벼워지는 시점 부터 빼면서 

0보다 작아지는지 혹은 가지고 있는 추의 무개를 다 빼보아도 여전히 0보다 큰지 판단하면 됩니다! 

예를 들면

3 1 6 2 7 30 1 추 들을 먼저 정렬합니다

 

1,1,2,3,7,30 으로 정렬 후 

 

예를 들면 21을 잴 수 있는 무개인지 확인하려면 

 

30은 건너뛰고  7,3,2,1,1 순서로 빼는 과정을 거치면 됩니다!!

 

 

import java.util.*
fun main(){
   var num = readLine()?.toInt()
    var numArray = IntArray(num!!)

    var str = readLine()
    var array = str?.split(" ")
    var check = false
    var answer =1
    for(i in 0 until num){
        numArray[i] = array?.get(i)!!.toInt()
    }
    Arrays.sort(numArray)
while(true){

    var temp = answer
    for(i in numArray.size-1 downTo 0){
        if(temp>=numArray[i]){
            if(temp-numArray[i]<0){
                check = true
                break
            }else if(temp-numArray[i]==0){
                break
            }else{
                temp -= numArray[i]
            }
        }
        if(i==0&&temp!=0){
            check =true
        }
    }
    if(check){
        println(answer)
        break
    }else{
        answer++
    }
}
}
728x90
반응형