1日1AL: 주사위(백준 1233) Java

Beautify.log·2021년 12월 28일
0

Coding Test Collections

목록 보기
5/10
post-thumbnail

문제


지민이는 주사위 던지기 게임을 좋아하여 어느 날 옆에 있는 동호를 설득하여 주사위 던지기 게임을 하자고 하였다. 총 3개의 주사위가 있다. 그리고 이 주사위는 각각 S1(2 ≤ S1 ≤ 20), S2(2 ≤ S2 ≤ 20), S3(2 ≤ S3 ≤ 40)개의 면이 있다. (실제로는 주사위가 6개의 면이 있는 것이 정상이지만 특별한 주사위라 생각하자.)

문제는 세 개의 주사위를 동시에 던졌을 때 가장 높은 빈도로 나오는 세 주사위의 합을 구하는 것이다.

예를 들어, S1 = 3, S2 = 2, S3 = 3으로 주어질 때, 주사위1은 S1(3)개의 면이 있으므로 1, 2, 3의 눈을 가지고, 주사위2는 S2(2)개의 면이 있으므로 1, 2의 눈을 가지며, 주사위3은 S3(3)개의 면이 있으므로 1, 2, 3의 눈을 가진다. 이 때, 이 3개의 주사위를 던져서 눈의 합을 구하면, (1, 1, 1) = 3, (1, 1, 2) = 4, (1, 1, 3) = 5, ... , (3, 2, 1) = 6, (3, 2, 2) = 7, (3, 2, 3) = 8과 같은 합들을 얻을 수 있다. 이 때, 가장 많이 발생하는 합을 구하는 것이다.


입출력 예시


입력

입력 파일의 첫째 줄에 정수 S1, S2, S3가 주어진다.

출력

출력 파일의 첫째 줄에 가장 높은 빈도로 나오는 세 주사위 합을 구하는 것이다. 단 답이 여러개라면 가장 합이 작은 것을 출력한다.

예시


정답 예시

사람을 미치게 만든 문제였습니다.

우선 각 주사위의 면의 개수를 입력받아주고 1부터 n만큼의 크기를 가진 배열에 1부터 차곡차곡 넣어줍니다.

주사위의 최대 면 개수가 40개라서 40번 루프를 도는 반복문을 만들어줬습니다.

이때 0부터 들어가면 안되기 때문에 인덱스 + 1을 해주었습니다.

그리고 계산 결과를 담는 배열은 주사위의 면 개수만큼이어야 하므로 각 주사위의 면 개수를 곱한 길이만큼 배열을 만듭니다.

3중 루프를 돌며 각 인덱스별 숫자를 더해서 배열에 넣어줍니다.

여기까지는 순조로웠습니다.

문제는 가장 높은 빈도로 나온 값 하나를 찾아야 하는데 이게 보통일이 아니었습니다.

또 배열을 만들어서 계산값을 담은 배열의 i번째 인덱스를 기준으로 새로 만든 배열에 넣어줬습니다.

그리고 새로만든 배열의 값을 0과 비교하며 계속 루프를 돌리고 그 값을 저장해주었습니다.

또 루프를 돕니다. 그런데 이 때는 인덱스를 반환해주는 루프문이고 최대값을 저장한 변수 q가 새로 만든 배열의 i번째와 일치할 때 해당 인덱스를 저장해주고 출력하는 것이었습니다.

꼬박 5시간이 걸렸습니다.

정말 머리는 안쓰면 굳나봅니다...

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        int s1 = sc.nextInt();
        int s2 = sc.nextInt();
        int s3 = sc.nextInt();

        int[] s1Arr = new int[s1];
        int[] s2Arr = new int[s2];
        int[] s3Arr = new int[s3];

        for (int i = 0; i < 40; i++) { // 억지스럽지만 주사위 면은 최대 40개라서 40까지
            if (s1Arr.length >= i + 1) s1Arr[i] = i + 1;
            if (s2Arr.length >= i + 1) s2Arr[i] = i + 1;
            if (s3Arr.length >= i + 1) s3Arr[i] = i + 1;
        }

        int sum = 0;
        int[] sArr = new int[s1 * s2 * s3];
        int p = 0;

        for (int i = 0; i < s1Arr.length; i++) {
            for (int j = 0; j < s2Arr.length; j++) {
                for (int k = 0; k < s3Arr.length; k++) {
                    sum = s1Arr[i] + s2Arr[j] + s3Arr[k];
                    sArr[p] = sum;
                    p++;
                }
            }
        }

        int[] sArr2 = new int[sArr.length];

        for (int i = 0; i < sArr2.length; i++) {
            sArr2[sArr[i]]++;
        }

        int res = 0;
        int q = 0;
        for (int i = 0; i < sArr2.length; i++) {
            q = Math.max(q, sArr2[i]);
        }

        for (int i = 0; i < sArr2.length; i++) {
            if (q == sArr2[i]) {
                res = i;
                break;
            }
        }

        System.out.println(res);

        sc.close();

    }
}
profile
tried ? drinkCoffee : keepGoing;

0개의 댓글