문제 출처: https://www.acmicpc.net/problem/2480
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개인 경우 말고는 소용이 없고 또 클래스에 대한 연습을 하기 위해서 클래스로 나누어 작성해보았다. 아직 미숙하기 때문에 시간이 조금 많이 걸리긴 했지만 약간은 감이 잡힌 느낌이다.
'컴퓨터 > 백준 알고리즘' 카테고리의 다른 글
백준 알고리즘 25305번: 커트라인(자바 Java) (0) | 2022.10.11 |
---|---|
백준 알고리즘 25304번: 영수증(자바 Java) (0) | 2022.10.10 |
백준 알고리즘 2525번: 오븐 시계(자바 Java) (0) | 2022.10.08 |
백준 알고리즘 25083번: 새싹(자바 Java) (0) | 2022.10.07 |
백준 알고리즘 3003번: 킹, 퀸, 룩, 비숍, 나이트, 폰 (자바 Java) (0) | 2022.10.06 |