[★2][백준2480번]주사위 세개 (JAVA)

Date:     Updated:

카테고리:

태그:

[★2][백준2480번]주사위 세개 (JAVA)

2480번 문제 ☞ https://www.acmicpc.net/problem/2480

난이도 ☞ [★2]

주사위 세개

  • 문제
    • 1에서부터 6까지의 눈을 가진 3개의 주사위를 던져서 다음과 같은 규칙에 따라 상금을 받는 게임이 있다.
      같은 눈이 3개가 나오면 10,000원+(같은 눈)×1,000원의 상금을 받게 된다. 같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)×100원의 상금을 받게 된다.
      모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)×100원의 상금을 받게 된다.
      예를 들어, 3개의 눈 3, 3, 6이 주어지면 상금은 1,000+3×100으로 계산되어 1,300원을 받게 된다. 또 3개의 눈이 2, 2, 2로 주어지면 10,000+2×1,000 으로 계산되어 12,000원을 받게 된다. 3개의 눈이 6, 2, 5로 주어지면 그중 가장 큰 값이 6이므로 6×100으로 계산되어 600원을 상금으로 받게 된다.
      3개 주사위의 나온 눈이 주어질 때, 상금을 계산하는 프로그램을 작성 하시오.
    • 첫째 줄에 3개의 눈이 빈칸을 사이에 두고 각각 주어진다.
    • 첫째 줄에 게임의 상금을 출력 한다.

      예제입력 예제출력
      3 3 6 1300
      예제입력 예제출력
      2 2 2 12000
      예제입력 예제출력
      6 2 5 600

내가 푼 풀이

이번 문제는 if-else를 적절히 사용하여 구현하는 것입니다.
각각 ScannerBufferedReader로 풀이하여 작성을 해보았습니다. 그리고 Math.max()를 이용하여 인자 값 중 큰 수를 리턴하는 방법을 사용하였습니다. 먼저 Scanner+Math.max()입니다.

[ 풀이 1 ]

메모리 : 17656KB
시간 : 216ms

Scanner, Math.max()

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);

		int a = s.nextInt();
		int b = s.nextInt();
		int c = s.nextInt();

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

	}

}

다음은 BufferedReader입니다.

[ 풀이 2 ]

메모리 : 14164KB
시간 : 124ms

BufferedReader, StringTokenizer, Math.max()

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());

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

	}

}

Scanner보다는 BufferedReader가 성능이 우수한 걸 알 수 있고, 만약 위의 Math.max()를 사용하지 않고 나는 오로지 if-else를 이용하여 코드 작성을 해보고 싶다하시는 분들도 계실까봐 아래의 풀이 3번에 정리해보았습니다. 이럴 경우 상당히 if-else문에 if-else문을 겹겹히 쌓아야되는 경우가 발생합니다. 코드는 아래와 같습니다.

[ 풀이 3 ]

메모리 : 17684KB
시간 : 208ms

Scanner, if-else

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);

		int a = s.nextInt();
		int b = s.nextInt();
		int c = s.nextInt();

		s.close();

		if (a != b && a != c && b != c) {		// a, b, c가 모두 다른 숫자 일 경우,
			int top;
			if (a > b) {						// b보다 a가 큰지
				if (c > a) {					// 크면 c가 a보다 큰지
					top = c;					// c가 크다면 c가
				} else {						// 그렇지 않으면
					top = a;					// a가 가장 큰 숫자
				}
			} else {							// b보다 a가 크지 않으면
				if (c > b) {					// c랑 b를 비교해서 c가 크면
					top = c;					// c가 가장 큰 숫자
				} else {						// c랑 b를 비교해서 b가 크면
					top = b;					// 가장 큰 숫자는 b
				}
			}
			System.out.println(top * 100);		// 가장 큰 숫자와 100을 곱해줌.
		} 
		else {
			if (a == b && a == c) {				// a, b, c가 모두 같을 때
				System.out.println(10000 + a * 1000);
			} else {
				if (a == b || a == c) {			// a, b, c 중 두 숫자만 같을 경우
					System.out.println(1000 + a * 100);
				} else {						// a, b, c 중 두 숫자만 같을 경우
					System.out.println(1000 + b * 100);
				}
			}
		}
	}
}

위처럼 구현할 수도 있으며, 위의 코드와 같이 if-else문이 길어진다.

BKJN 카테고리 내 다른 글 보러가기

댓글 남기기