Algorithm/기타

[백준 2851번] 슈퍼마리오

agility 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);
	}
}