ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준 2851번] 슈퍼마리오
    Algorithm/기타 2020. 1. 12. 23:38

    백준알고리즘 2851번 : 슈퍼마리오

     

    문제를 정확히 이해하는 데 시간이 조금 걸렸던 것 같다.

    요지는, 무조건 처음의 버섯은 먹어야하는 것이다.

    즉, 가운데부터 먹고 가운데부터 끊을 수 없다.

    시작은 1번부터 하는 것으로 고정이 되는 것이고, 끝은 2번째가 될 지, 10번째가 될지 모르는 것이다.

     

    나는 가운데부터 먹고서도 연속으로 버섯을 먹기만 하면 되는 것인 줄 알고,, 코드를 수정했다.

    역시 문제를 잘 파악하는 것이 문제 해결을 위한 첫 번째 단계인것이다..

     

     

     

     

    풀이 과정

     


    1. 버섯 10개의 점수를 받아 배열에 넣는다. 여러 변수들을 정의한 뒤, while문에 조건을 설정하여 
       해당하는 조건만큼만 while문이 돌아가도록 만든다.
    2. while문의 조건은 다음과 같다.
       2-1. 다음 버섯이 10번째 버섯이 아니고,(&&)
       2-2. 100과 [다음 버섯의 점수+지금까지의 점수 합]의 차이가, 100과 [지금까지의 점수 합]
             보다 작거나 같을 경우
    3. while문에서 100에 근접한 정답을 추출할 수 있지만, 다음의 경우에 대비하여,
       while문이 끝난 뒤에 if문을 통해 어떤 것이 정답인지 찾는다.
       [98 4 .. xxx....]인 경우, 98과 102는 100과의 절댓값의 차이는 같지만 102를 정답으로 채택한다.
       즉, 절댓값의 차이가 같은 경우, 더 큰 값을 정답으로 저정한다.

     

     

     

    소스 ▽

    더보기
    import java.util.Scanner;
    
    public class Main {// 2851번 슈퍼 마리오
    
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);
    		int[] lst = new int[10];
    		for (int i = 0; i < lst.length; i++) {
    			lst[i] = sc.nextInt();
    		}
    		int ans = -1;
    		boolean tag = true;
    		int calculate = 0;
    		int k = 0;
    		while (tag == true) {
    			calculate += lst[k];
    			if (k < 9 && Math.abs(100 - calculate - lst[k + 1]) <= Math.abs(100 - calculate)) {
    				k++;
    			} else {
    				tag = false;
    			}
    		}
    		if (Math.abs(100 - calculate) < Math.abs(100 - ans)
    				|| (Math.abs(100 - calculate) == Math.abs(100 - ans) && calculate > ans)) {
    			ans = calculate;
    		}
    
    		System.out.println(ans);
    	}
    }
    

     

     

     

    댓글

Designed by Tistory.