알고리즘 문제풀이/백준

#2851 : 슈퍼 마리오

모항 2022. 5. 12. 18:09

풀이방법

사용된 것:

브루트포스 알고리즘

 

2022.05.12

버섯을 앞에서부터 먹어가며 계산한다.

 

이번 버섯을 먹었을 때의 총합이 100보다 작은 경우에는 무조건 먹는 것이 이득이므로 먹고 넘어간다.

 

이번 버섯을 먹었을 때의 총합이 100 이상인 경우가 처음 등장했을 때 답을 출력해야 한다. 다음과 같은 과정을 통해 답을 결정한다.

이번 버섯을 먹었을 때 총합이 100보다 얼마나 큰지 그 차를 변수 A에 저장한다.

이번 버섯을 먹지 않을 때 총합이 100보다 얼마나 작은지 그 차를 변수 B에 저장한다.

그리고 A와 B를 비교한다.

 

A보다 B가 작다면 이번 버섯의 값을 더하지 않은 총합 (이번 버섯을 먹지 않았을 경우의 총합)을 화면에 출력하고 프로그램을 종료한다.

B보다 A가 작다면 이번 버섯의 값을 더한 총합 (이번 버섯을 먹었을 경우의 총합)을 화면에 출력하고 프로그램을 종료한다.

A와 B가 같다면 문제에서 정해준 바에 따라 이번 버섯을 먹었을 때의 총합을 출력하고 프로그램을 종료한다.

 

위의 과정을 거쳤는데 프로그램이 종료되지 않고 10회 반복 for문이 끝났다면, 10개의 버섯을 다 먹었는데도 총합이 100보다 작은 것이다. 그러므로 정답 출력도 아직 안 되었다. 모든 버섯 값의 총합을 지금 화면에 출력해줘야 한다.

 

코드

Java(2022.05.12)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int sum = 0;
		for(int i = 0; i<10; i++) {
			int n = Integer.parseInt(br.readLine());
			//이번 버섯을 먹어도 합이 100보다 작다면 버섯을 먹고 넘어감
			if(sum+n<100) {sum += n; continue;}
			
			//이번 버섯을 먹었을 때의 결과가 100 이상일 경우
			else {
				//이번 버섯을 안 먹었을 때 100과의 차이
				int a = 100-sum;
				//이번 버섯을 먹었을 때 100과의 차이
				int b = sum+n-100;
				
				//a와 b를 비교하여 먹는 경우와 안 먹는 경우 중 최적의 결과를 출력
				//먹는 게 이득인 경우
				if(a>b) System.out.print(sum+n);
				//안 먹는 게 이득인 경우
				else if(a<b) System.out.print(sum);
				//먹는 것과 안 먹는 것의 100으로부터의 차이가 같은 경우(먹은 쪽을 출력)
				else System.out.print(sum+n);
				System.exit(0);
			}
		}
		
		//주어진 버섯을 다 먹었는데도 100보다 작은 경우에는 for문 안에서 정답출력이 되지 않음
		//따라서 여기 for문 밖에서 출력해주기
		System.out.print(sum);

	}

}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

#2630 : 색종이 만들기  (0) 2022.05.18
#1269 : 대칭 차집합  (0) 2022.05.16
#9742 : 순열  (0) 2022.05.10
#2160 : 그림 비교  (0) 2022.05.10
#1037 : 약수  (0) 2022.05.07