관리 메뉴

사과하는 제라스

[백준 BOJ 2480번] 주사위 세개 본문

JAVA 백준 알고리즘 문제풀이/조건문

[백준 BOJ 2480번] 주사위 세개

Xerath(제라스) 2022. 3. 27. 17:48

목차

    728x90
    반응형

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

     

    2480번: 주사위 세개

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

    www.acmicpc.net

     

    1. 문제

    1에서부터 6까지의 눈을 가진 3개의 주사위를 던져서 다음과 같은 규칙에 따라 상금을 받는 게임이 있다.

    1. 같은 눈이 3개가 나오면 10,000원+(같은 눈)×1,000원의 상금을 받게 된다. 
    2. 같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)×100원의 상금을 받게 된다. 
    3. 모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)×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개 주사위의 나온 눈이 주어질 때, 상금을 계산하는 프로그램을 작성 하시오.


    2. 입력

    첫째 줄에 3개의 눈이 빈칸을 사이에 두고 각각 주어진다. 

    3 3 6
    2 2 2
    6 2 5

    3. 출력

    첫째 줄에 게임의 상금을 출력 한다.

    1300
    12000
    600

    4. 풀이

    이 문제에서 키 포인트는 같은 숫자 개수를 찾는 것이다. 물론 3개를 for문과 if문의 혼합을 통해 구하는 것이 가능하지만 이는 주사위 개수가 적은 문제의 경우에만 사용할 수 있다. 주사위 개수가 많아짐에 따라 잦은 비교문이 요해지고 n 중 for문이 등장해야 하다보니 시간복잡도의 기하급수적 증가가 생겨나기 때문이다.

     

    이 경우 코드가 매우 복잡해지고 길어지므로 배열에서 해당 값이 등장하는 Frequency(빈도)를 찾아낸 후 그에 따라 값을 적용하는 방법을 사용할 수 있다. 이 기능은 Collections.frequency에 정의되어 있으며 이를 잘 사용하면 목적성에 따라 값을 이용할 수 있다. 이와 관련해서는 다음 블로그를 참조하였다.

    https://hianna.tistory.com/572 

     

    [Java] ArrayList 중복 값 개수 세기

    Collections.frequency() 이용하기 Map 이용하기 1. Collections.frequency() 이용하기 public static int frequency(Collection<?> c, Object o) 위 메소드는 첫번째 파라미터로 전달된, Collection 객체에..

    hianna.tistory.com


    5. 소스코드

    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 = 0;
            if(a==b && b==c) System.out.println(10000+a*1000);
            else if(a==b) System.out.println(1000+a*100);
            else if(a==c) System.out.println(1000+a*100);
            else if(b==c) System.out.println(1000+b*100);
            else{
                if(a>=b){
                    if(a>c) max = a;
                    else max = c;
                }
                else{
                    if(b>c) max = b;
                    else max = c;
                }
                System.out.println(max*100);
            }
        }
    }

    6. 배운 것

    어려운 문제는 아니나 for문이 들어가면 오히려 힘들어지는 문제였다. 오직 if문만을 사용하여 문제를 푸는 것이 문제의 목적성에 맞는 것 같다.

     

    또한, 문제의 연장선으로서 주사위 개수가 많아지는 경우엔 Collections.frequency 함수를 활용해서 배열에 등장하는 값들의 중복 여부 및 중복개수를 구해낼 수 있다는 것을 배웠다.

     

     

    728x90
    반응형