본문 바로가기

컴퓨터/백준 알고리즘

백준 알고리즘 2480번: 주사위 세개(자바 Java)

문제 출처: https://www.acmicpc.net/problem/2480

 

2480번: 주사위 세개

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

www.acmicpc.net

1. 코드

import java.util.*;

class Dice{
	private int num;
	private int cnt;
	static int biggest_Num = 0;			//가장 큰 수
	static int biggest_Cnt = 0;			//같은 눈이 나온 횟수
	static int biggest_Cnt_Num = 0;			//같은 눈
	
	Dice(int num){
		this.num = num;
		cnt = 0;
		biggest_Num = (biggest_Num > num) ? biggest_Num : num;
	}
	
	//중복 확인
	public void diceCheck(Dice[] d, int index) {
		for(int i = index; i - 1 >= 0; i--)
			if(d[index].num == d[i - 1].num)
				cnt++;
		
		if(biggest_Cnt < cnt) {
			biggest_Cnt = cnt;
			biggest_Cnt_Num = num;
		}
	}
	
	//상금 계산
	static int prizeMoney() {
		int result;
		switch(Dice.biggest_Cnt) {
		case 1: result = 1000 + Dice.biggest_Cnt_Num * 100; break;
		case 2: result = 10000 + Dice.biggest_Cnt_Num * 1000; break;
		default: result = Dice.biggest_Num * 100; break;
		}
		return result;
	}
}

class Main{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		Dice[] d = new Dice[3];
		
		d[0] = new Dice(sc.nextInt());
		for(int i = 1; i < 3; i++) {
			d[i] = new Dice(sc.nextInt());
			d[i].diceCheck(d, i);	
		}

		System.out.println(Dice.prizeMoney());
		sc.close();
	}
}

(실행)

2. 풀이

먼저 Dice라는 클래스를 만들어 주사위의 정보를 저장할 수 있게 한다.

private int num;
private int cnt;
static int biggest_Num = 0;		//가장 큰 수
static int biggest_Cnt = 0;		//같은 눈이 나온 횟수
static int biggest_Cnt_Num = 0;		//같은 눈

인스턴스 멤버로 주사위 눈의 수를 저장하기 위한 num과 주사위의 눈이 중복된다면 그 횟수를 저장할 cnt 변수를 선언하고, 가장 큰 수와 같은 눈 그리고 같은 눈이 나온 횟수는 인스턴스 각각에 존재할 이유가 없기에 정적 멤버로 선언한다.

Dice(int num){
	this.num = num;
	cnt = 0;
	biggest_Num = (biggest_Num > num) ? biggest_Num : num;
}

Dice의 생성자는 주사위 눈의 수(num)값을 전달받아서 저장하고 아직 중복된 값을 확인하지 않았기에 중복 횟수(cnt)값은 0으로 초기화 해준다. 그리고 입력된 주사위 눈의 수가 기존에 확인된 가장 큰 주사위 눈의 수(biggest_Num)보다 크다면 해당 값으로 저장한다.

//중복 확인
public void diceCheck(Dice[] d, int index) {
	for(int i = index; i - 1 >= 0; i--)
		if(d[index].num == d[i - 1].num)
			cnt++;
		
	if(biggest_Cnt < cnt) {
		biggest_Cnt = cnt;
		biggest_Cnt_Num = num;
	}
}

클래스 메소드인 diceCheck 메소드는 주사위 눈의 중복을 확인하여 총 중복 횟수와 중복되는 주사위의 눈이 무엇인지 확인해준다. 먼저 반복문을 통해서 이전에 입력된 주사위 눈의 값과 현재 입력된 주사위 눈의 값이 중복되는 횟수(cnt)를 확인 후 가장 중복이 많이 되었다면 그 수로 저장한다.

Scanner sc = new Scanner(System.in);
Dice[] d = new Dice[3];
		
d[0] = new Dice(sc.nextInt());
for(int i = 1; i < 3; i++) {
	d[i] = new Dice(sc.nextInt());
	d[i].diceCheck(d, i);	
}

지금까지 설명한 내용은 main 함수에서는 이렇게 작성된다.

//상금 계산
static int prizeMoney() {
	int result;
	switch(Dice.biggest_Cnt) {
	case 1: result = 1000 + Dice.biggest_Cnt_Num * 100; break;
	case 2: result = 10000 + Dice.biggest_Cnt_Num * 1000; break;
	default: result = Dice.biggest_Num * 100; break;
	}
	return result;
}

prizeMoeny 메소드는 주사위 눈의 중복 횟수에 따른 상금을 계산하기 위한 메소드이다. 문제에서 설명한 수식에 맞추어 switch 함수를 활용하여 계산 후 결과 값을 반환해준다.

3. 느낀점

이 문제를 풀면서 그냥 if else문을 활용하여 main 함수에서 작성할 수도 있었지만 그렇게 된다면 주사위 수가 3개인 경우 말고는 소용이 없고 또 클래스에 대한 연습을 하기 위해서 클래스로 나누어 작성해보았다. 아직 미숙하기 때문에 시간이 조금 많이 걸리긴 했지만 약간은 감이 잡힌 느낌이다.