백준 알고리즘/조건문

백준 2408 :: 주사위 세개 [JAVA]

Sun720 2022. 5. 19. 23:28

▶ 문제

https://www.acmicpc.net/problem/2480

 

2480번: 주사위 세개

1에서부터 6까지의 눈을 가진 3개의 주사위를 던져서 다음과 같은 규칙에 따라 상금을 받는 게임이 있다.  같은 눈이 3개가 나오면 10,000원+(같은 눈)×1,000원의 상금을 받게 된다.  같은 눈이 2개

www.acmicpc.net

 설명

조건이 세 개가 있다. 

1. 같은 눈이 3개가 나올 때

2. 같은 눈이 2개가 나올 때

3. 같은 눈이 0개가 나올 때 (다 다르게 나올 때)

 

조건에 따라 다른 연산을 수행하여 결과 값을 얻어야 한다.

 

문제 풀이 방식에 따라 &&와 || 연산자 이해와 Math.max( ) , Arrays.sort( ) 메소드를 사용해 볼 것이다.

문제 풀이

🌱 풀이1. && 와 || 연산자 사용

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

public class Main {

	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer strTo = new StringTokenizer(br.readLine(), " ");
		
		int a = Integer.parseInt(strTo.nextToken());
		int b = Integer.parseInt(strTo.nextToken());
		int c = Integer.parseInt(strTo.nextToken());
		
		int reward = 0;

		if (a == b && b ==c) {
			reward = 10000 + (a*1000);
		}else if( a== b || a == c) {
			reward = 1000 + (a*100);
		}else if(b == c) {
			reward = 1000 + (b*100);
		}else {
			reward = Math.max(Math.max(a, b), c) * 100;
		}
		
		System.out.println(reward);
		}
}

문제에서 밝혀낸 조건 세 개와 별개로 실제 식에서는 네 개의 조건을 생성해야 한다.

 

1번째 if : (a == b && b ==c && c == a)   <- 같은 눈이 3개가 나올 때

입력되는 주사위 눈의 수 세 개가 모두 같을 때를 나타낸다. 

 

2번째 if : ( a== b || a == c)   <- 같은 눈이 2개가 나올 때

공통으로 들어가는 a가 연산에서 쓰이게 된다.  reward = 1000 + (a*100)

 

3번째 if : (b == c)   <- 같은 눈이 2개가 나올 때

이 if 문을 통과할 차례라면 위의 if문을 만족하지 못했다는 의미이기 때문에 2번째 if 의 a== b 와  a == c 가 모두 거짓이므로 비교를 아직 하지 않은 b와 c가 같은지를 물어 같은 눈 2개를 만족하는 지에 대한 if문을 만들 수 있다. 

 

4번째 if : (else)   <-  같은 눈이 0개가 나올 때 (다 다르게 나올 때)

연산을 수행할 때 Math.max() 메소드를 사용해야 한다. max( ) 메소드는 두 개의 수만을 비교하여 최대값을 반환하므로 3개의 수를 비교해야 하는 이 조건식에서 이 메소드를 2번 중첩해서 사용하도록 한다. 

 

 

🌱 풀이2. && 와 || 연산자 사용(2)

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

public class Main {
	
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		int A = Integer.parseInt(st.nextToken());
		int B = Integer.parseInt(st.nextToken());
		int C = Integer.parseInt(st.nextToken());
		//최대값
		int max = A;
		//세 수가 같을때
		if(A == B && B == C) {
			System.out.println(10000 + (1000 * A));
		//세 수가 다를때
		}else if(A != B && B != C && A != C) {
			//최대값 구하기
			if(max < B) {
				max = B;
			}
			if(max < C) {
				max = C;
			}
			System.out.println(100 * max);
		//두 수만 같을때
		}else {
			//같은 수 구하기
			if(A != B) {
				System.out.println(1000 + (100 * C));
			}else if(A != C) {
				System.out.println(1000 + (100 * B));
			}
			
		}
	}

}

특별한 메소드를 쓰지 않았기 때문에 풀이1의 코드를 잘 이해했다면 어려울 것이 없는 코드이다.

 

🌱 풀이3. 배열 정렬 이용

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Boj_2480_Dice3 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());

		int[] arr = new int[3];

		for (int i = 0; i < 3; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}

		Arrays.sort(arr);

		if (arr[0] == arr[2]) {
			System.out.println(10000 + arr[0] * 1000);
		} else if (arr[0] == arr[1]) {
			System.out.println(1000 + arr[0] * 100);
		} else if (arr[1] == arr[2]) {
			System.out.println(1000 + arr[1] * 100);
		} else {
			System.out.println(arr[2] * 100);
		}
	}
}

 

입력 받은 1개의 값을 세 개의 수로 나누어 for 문을 통해 arr 배열에 담도록 한다.

그 뒤 Arrays.sort(arr) 를 통해서 오름차순으로 정렬한다.

요소의 값들을 비교하자면 arr[0] <= arr[1] <= arr[2] 가 될 것이다.

 

1번째 if : (arr[0] == arr[2])  <- 같은 눈이 3개가 나올 때

입력되는 주사위 눈의 수 세 개가 모두 같을 때를 나타낸다.  

맨 첫 요소와 마지막 요소를 비교한 것이기 때문에 두 개가 같다면 전체가 같은 값이라는 것을 유추할 수가 있다.

 

2번째 if :(arr[0] == arr[1])   <- 같은 눈이 2개가 나올 때

1번째 if가 거짓이여서 그곳을 건너 뛰고 이번 if로 넘어온 것이기 때문에,

세 개의 눈이 같지는 않지만 두 눈이 같다는 의미이므로

같은 눈이 2개 나올 때를 나타낸다.

 

3번째 if : (arr[1] == arr[2])   <- 같은 눈이 2개가 나올 때

2번째 if문과 마찬가지 이유로 같은 눈이 2개 나오는 때를 나타낸다.

 

4번째 if : (else)   <-  같은 눈이 0개가 나올 때 (다 다르게 나올 때)

정렬된 배열의 값들을 이용하는 것이기 때문에 풀이1과 다르게 max() 메소드를 굳이 사용하지 않아도 최대값이 마지막 요소인 arr[2] 인 것을 이미 알고 있다. 그래서 연산 식이 좀 더 간결해 보이게 된다.

 

 

Log

알고나면 쉬운 문제일 수 있으나 처음에 풀어볼 땐 생각보다 많이 헤맸다. 

조건식을 어떻게 써야 할지 머릿속에서 그려내는 것이 쉽지 않았는데 

다른 코드를 참고해서 분석하니 if의 특성을 좀 더 이해할 수 있었다. 

예를 들어 if 다음에 나오는 else if 문을 작성할 때 앞선 if 조건식의 큰 선택지를 제외시키게 되는데

마치 차집합이 연상되었다.

728x90
반응형