알고리즘/백준

[백준] 2480 - 주사위 세 개

leegeonwoo 2023. 10. 17. 04:28

• 문제

 

이해하면 어렵지않은 문제이지만, 처음 코드를 본다면 난해한 문제입니다.

코드가 복잡해보인다고해서 포기하지않고 끝까지 풀어봐주세요 !


• 풀이

 

먼저 주사위 A, B, C의 값을 각각 입력받습니다.

그리고 상금을 계산하기위한 정수타입변수 result를 선언해주도록 하겠습니다.

 

문제를 풀기위해 생각해야하는 경우의 수는 3가지입니다.

1. A,B,C가 모두 같은경우

2. A,B,C가 모두 다른경우

3. A,B,C중 두 개만 같은경우

 

1,2의 경우에는 식으로 표현하면 아주 쉽게 표현할 수 있습니다.

A,B,C가 모두 같은경우A == B && B == C,

A,B,C가 모두 다른경우 A != B && B != C && A != C 와같이 식으로 표현할 수 있습니다.

A,B,C중 두 개만 같은경우else로 집어 넣겠습니다.

 

각 경우의 수에대해서 상금을 계산하는 식은

 

A,B,C가 모두 같은경우(A == B && B == C)이면 result = 10000 + A * 1000입니다. 주사위 세 개의 수는 모두 같은 값이기때문에 A,B,C중 아무 값을 넣어도 상관없습니다.

 

A,B,C가 모두 다른경우(A != B && B != C && A != C)이면 result = 가장 큰 눈 * 100입니다. (이 때 가장 큰 눈을 max변수로 선언하겠습니다.)

여기서 max의 값을 찾아야하는데, 이 과정이 조금 복잡할 수 있습니다.

 

 

먼저 A가 기준인 경우입니다.

if(A>B) { 
	if(A>C) { 
		max = A;
}else {
		max = C;
}

(A>B)가 참이고, (A>C)도 참이면 당연히 max값은 A가 됩니다.

(A>B)가 참이고, (A>C)가 거짓이면 A는 B보단 크지만 C보단 작기때문에 max값은 C가됩니다.

 

 

이어서 B가 기준인 경우를 보겠습니다.

else if(B>C) { 
		max = B;
	}else {
		max = C;
	}

 

B를 기준으로 살펴볼 때는 (A>B)가 false인 즉, B가 A보다 큰 상태입니다.

따라서 (B>C)이면, max는 B가 됩니다. 

(A>B)가 false이고, (B>C)도 false이면 max = C가 됩니다.

 

이렇게해서 max값은 구하였기때문에 result를 구하는 식을 써주어 마무리해주면 됩니다.

 

 

모든 주사위의 눈이 다른경우 max값을 찾은 뒤, result를 구하는 코드입니다.

else if(A != B && B != C && A != C) { //모든 주사위의 눈이 다른경우
			if(A>B) { //A가 B보다 크고 
				if(A>C) { //A가 C보다 큰경우 max = A
					max = A;
				}else { //A가 B보단 크지만 C보단 작은경우 max = C
					max = C;
				}
			}else if(B>C) { //(A>B)가 false인 경우 즉, B>A이고 B>C이면 max = B
				max = B;
			}else { // B>A이지만 C>B이면 max = C
				max = C;
			}
			result = max * 100;

 

 

이제 주사위의 눈이 두 개만 같은경우의 result값만 구해내면 됩니다.

이 경우에도 max값을 찾아야하는데, 이 때는 A B C 세 값중 두 개의 값이 동일하면 그 값이 max값 이기때문에 비교적 찾는방법이 간단합니다.

 

코드로 바로보시면 이해가 되실겁니다.

else{ //주사위의 눈이 2개만 같은경우
			int num = 0;
			if(A == B) {
				num = A;
			}else if(A == C) {
				num = A;
			}else if(B == C) {
				num = B;
			}
			result = 1000 + num * 100;
		}

num변수를 선언해 조건문을 통해 두 개의 값이 같은경우 같은 값을 num에 저장해 result값을 계산해줍니다.

 

 

 

아래는 총 코드입니다.

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int A = sc.nextInt();
		int B = sc.nextInt();
		int C = sc.nextInt();
		int result = 0;
		int max = 0;
		
		if(A == B && B == C) { //모든 주사위의 눈이 같을 경우
			result = 10000 + A * 1000;
		}else if(A != B && B != C && A != C) { //모든 주사위의 눈이 다른경우
			if(A>B) { //A가 B보다 크고 
				if(A>C) { //A가 C보다 큰경우 max = A
					max = A;
				}else { //A가 B보단 크지만 C보단 작은경우 max = C
					max = C;
				}
			}else if(B>C) { //(A>B)가 false인 경우 즉, B>A이고 B>C이면 max = B
				max = B;
			}else { // B>A이지만 C>B이면 max = C
				max = C;
			}
			result = max * 100;
		}else{ //주사위의 눈이 2개만 같은경우
			int num = 0;
			if(A == B) {
				num = A;
			}else if(A == C) {
				num = A;
			}else if(B == C) {
				num = B;
			}
			result = 1000 + num * 100;
		}
		System.out.println(result);
	}
}

 


마무리

개인적으로 저는 이 문제를 풀면서 너무 복잡하고 어렵다고 생각했고 다른 블로거분들의 좋은 글을 봐도 이해가 안됐었습니다...

그래서 제 블로그를 보시는 분들만큼은 쉽게 이해하였으면 좋다고 생각해서 말로도 설명해보고 주석에는 식으로 표현해 여러가지 방법으로 설명해보았습니다... 그래도 이해가 안되시는 분들은 댓글 달아주시면 감사하겠습니다 ㅠㅠ

728x90