ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2437 저울(자바)
    백준/그리디 알고리즘 2022. 2. 19. 19:12
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.Arrays;
    import java.util.StringTokenizer;
    
    
    public class Main {
    	
    	static int N;
    	static int number [];
    	
    	public static void main(String[] args) throws IOException {
    	
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		N = Integer.parseInt(br.readLine());
    		number= new int [N];
    		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
    		
    		
    		for(int i=0; i<N; i++) {
    			number[i] = Integer.parseInt(st.nextToken());
    		}
    		
    		Arrays.sort(number);
    		
    		int minimum = solve();
    		System.out.println(minimum);
    	}
    	
    	public static int solve() {
    		
    		int result =0;
    		int max = 0;
    		if(number[0]!=1) {
    			result = 1;
    			return result;
    			
    		}else {
    			max = 1;
    			
    		}
    		
    		
    		for(int i=1; i<N; i++) {
    			if(number[i] <= max +1 ) {
    				max+= number[i];
    			}else {
    				result = max+1;
    				return result;
    				
    			}
    		}
    		
    		result = max+1;
    		return result;
    	}
    }

     

     

    우리는 주어진 저울추로

    측정할 수 있는 무게를 

    1 2 3 4 5 6 7 8 .. 이렇게 만드는 게 목적이다.

    그러다가 만약 9 를 만들 수 없다!

    그러면 주어진 저울추로 무게 9 를 측정할 수 없다는 거니깐,

    9를 답으로 리턴하면 된다.

     

    그러면, 1 2 3 4 5 6 7 .. 을 만들어보자.

     

    1) 1 만들기

    <1> 저울추 중에 1이 있으면 된다.

    즉, 예시에 나오는 저울추 값들을 number 배열에 넣어서 이를 오름차순 할 예정인데,

    이 때 맨 앞에 1이 없다면 무게 1을 측정할 수 없으므로 정답으로 1을 리턴하면 된다.

    하지만, 맨 앞에 1이 있다면 그 다음 2를 만들면 된다.

     

    2) 2 만들기 : 1 또는 2가 오면 된다.

    <1> 1이 온다.

    앞에서 저울추 1이 있다고 했으니, 여기에 만약 저울추 1이 또 있다면 더해서 2를 만들 수 있다.

    존재하는 저울추 무게 : 1 1

    측정 가능 무게 : 1 2(가능)

     

    <2> 2가 온다.

    존재하는 저울추 무게 : 1 2

    측정 가능 무게 : 1 2(가능) 3

     

    3) 3 만들기 

    앞의 2 만들기 <1> 에서 1이 온 경우, 측정 가능 무게가 1 2 까지였다.

    그럼 이제 3을 만들어야 한다.

     

    <1> 1이 온다.

    존재하는 저울추 무게 : 1 1 1 

    측정 가능 무게 : 1 2 3(가능)

     

    <2> 2가 온다.

    존재하는 저울추 무게 : 1 1 2

    측정 가능 무게 : 1 2 3(가능) 4 

     

    <3> 3이 온다.

    존재하는 저울추 무게 : 1 1 3

    측정 가능 무게 : 1 2 3(가능) 4 5

     

    <4> 만약 4가 왔다.

    이 경우는 안된다.

     

    존재하는 저울추 무게 : 1 1 4

    측정 가능 무게 : 1 2 4 5 6 

     

    3이 되는 건 절대 불가하다.

     

    규칙을 찾아보면,

    존재하는 저울추 무게 : 1 1 

    측정 가능 무게 : 1 2 

    인 상태에서, 다음으로 측정 가능 무게 3을 만들어야 하는데,

    이 때 올 수 있는 저울추 무게는 3보다 작거나 같은 값이 와야 한다는 것이다.

     

    즉, 

    지금까지 만든 최댓값 + 1 (위의 경우 3) 보다 작거나 같은 값이 배열에서 나와야만 하고,

    그렇지 않다면 1 2 3 4 5 6 .. 이렇게 만드는게 불가하다.

    그래서 이렇게 불가한 경우는, 지금까지 만든 최댓값 + 1 을 정답으로 리턴하면 된다.

    문제에서 주어진 추들로 측정할 수 없는 양의 정수 무게 중 최솟값을 출력하라고 했기 때문이다.

     

    # 주의점

    내가 아직 return 에 익숙하지 않아서 글로 남기는데,

    solve 메서드에 보면 

    		if(number[0]!=1) {
    			result = 1;
    			return result;
    			
    		}

    여기서 return 을 사용한 경우를 볼 수 있다.

    즉 number[0] 이 1 이 아니면 result 에 1을 담아서 return 하라고 되어 있는데,

    이렇게 return 하고 나면 solve 메서드의 아래 코드 부분이 실행되지 않고 끝이 난다.

    그리고 result 에는 1 이 담긴 상태가 된다.

     

    참고 자료 : 

    https://plplim.tistory.com/59

     

    [백준 #2437번 JAVA] 저울 풀이

    📄 저울 [백준 2437번] 🔗 [전체 소스 코드] 🔗 [문제 풀러 가기] 문제 풀이 문제는 그리디 알고리즘으로 해결하였습니다. N개의 저울추가 주어질 때 측정할 수 없는 최소값을 찾는 문제입니다.

    plplim.tistory.com

     

     

    '백준 > 그리디 알고리즘' 카테고리의 다른 글

    2872 우리집엔 도서관이 있어  (0) 2022.05.02
    2839 설탕 배달  (0) 2022.03.10
    1439 뒤집기  (0) 2022.02.10
    11047 동전0  (0) 2021.10.18
    11399 ATM  (0) 2021.10.18

    댓글

Designed by Tistory.