지민이는 주사위 던지기 게임을 좋아하여 어느 날 옆에 있는 동호를 설득하여 주사위 던지기 게임을 하자고 하였다. 총 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();
}
}