Study/Baekjoon

[Java] Baekjoon2851: 슈퍼 마리오

devyoseph 2022. 2. 17. 12:51

슈퍼 마리오

1 초 128 MB 11633 4578 4047 40.010%

문제

슈퍼 마리오 앞에 10개의 버섯이 일렬로 놓여져 있다. 이 버섯을 먹으면 점수를 받는다.

슈퍼 마리오는 버섯을 처음부터 나온 순서대로 집으려고 한다. 하지만, 모든 버섯을 집을 필요는 없고 중간에 중단할 수 있다. 중간에 버섯을 먹는 것을 중단했다면, 그 이후에 나온 버섯은 모두 먹을 수 없다. 따라서 첫 버섯을 먹지 않았다면, 그 이후 버섯도 모두 먹을 수 없다.

마리오는 받은 점수의 합을 최대한 100에 가깝게 만들려고 한다.

버섯의 점수가 주어졌을 때, 마리오가 받는 점수를 출력하는 프로그램을 작성하시오.

입력

총 10개의 줄에 각각의 버섯의 점수가 주어진다. 이 값은 100보다 작거나 같은 양의 정수이다. 버섯이 나온 순서대로 점수가 주어진다.

출력

첫째 줄에 마리오가 받는 점수를 출력한다. 만약 100에 가까운 수가 2개라면 (예: 98, 102) 마리오는 큰 값을 선택한다.

풀이

인덱스 내부에서 100이 넘을 때까지 더하고 이전값과 현재값을 비교해 100과의 차이가 더 적은 수를 반환합니다.

 

100을 기준으로 100보다 작은 값, 큰 값 구하기

구하는 값이 두 개므로 변수를 두 개 사용해야합니다.

한 변수는 100을 넘기 전까지의 합을 기록해야하고 한 변수는 100을 넘었을 때의 합을 기록해야합니다.

100을 처음 넘었을 때 그 값을 구한 다음 다시 그 값에서 더해줬던 값을 빼서 100을 넘기 전의 값을 구할 수 있습니다.

이 두개를 비교해 100에 가장 가까운 수를 고르고 출력하면 됩니다.

이 풀이에서는 위 방법과 조금은 다르게 이전항에 현재항을 대입하고 현재항에 값을 더하는 식으로 구현했습니다.

 

전체 코드

import java.util.*;

public class Main {
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		int prev=0,now=0;
        
		for(int i=0; i<10; i++) { //10개의 입력값
			prev = now; //현재 now 값을 이전값 prev에 저장합니다
            
			now += sc.nextInt(); //그리고 now에 다음 값을 더합니다
            
			if(now>=100) { // now가 100을 넘기는 순간: prev에는 100보다 작은 값, now에는 100보다 큰 값이 저장
				i=10; //반복문을 종료합니다.
			}
		}
		if(now-100<=Math.abs(100-prev)) { // 그 둘을 비교하고 100과의 차이가 적은 수를 내보냅니다
			System.out.println(now);
		}else {
			System.out.println(prev);
		}
	}
}