티스토리 뷰

백준/BRONZE

[백준/C++] 1233 주사위

ajaa 2021. 2. 18. 22:32

문제 

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

출력

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

 

#include <iostream>
using namespace std;

int main()
{
    int s1, s2, s3;
    int countarr[81] = {};
    cin >> s1 >> s2 >> s3;
    int k = 0;
    int max = 0;
    for (int i = 1; i <= s1; i++) {
        for (int j = 1; j <= s2; j++) {
            for (int h = 1; h <= s3; h++) {
                countarr[i + j + h]++;      
                if (countarr[i + j + h] > max) {    
                    max = countarr[i + j + h];         
                }
            }
        }
    }
    for (int i = 3; i <= s1+s2+s3; i++) {
        if (max == countarr[i]) {           
            cout << i << endl;
            break;
        }
    }
}

 

해결: 각 숫자의 합을 인덱스로 하여 배열에 저장

합이 같을 때마다 빈도수 1 증가

빈도수가 현재  max보다 클 경우 빈도의 최댓값을 갱신

countarr배열의 인덱스 3(1+1+1)부터 시작하여 순회

max와 같은 숫자가 있다면 해당 인덱스 출력한 후 반복문 빠져나옴

(합이 나오는 빈도가 같은 경우 합이 가장 작은(즉, 인덱스가 가장 작은) 것을 출력하기 위함)

 

 

 

'백준 > BRONZE' 카테고리의 다른 글

[백준/C++] 1919 애너그램 만들기  (0) 2021.02.23
[백준/C++] 1340 연도 진행바  (0) 2021.02.20
[백준/C++] 1193 분수찾기  (0) 2021.02.18
[백준/C++] 1225 이상한 곱셈  (0) 2021.02.18
[백준/C++]1075 나누기  (0) 2021.02.15
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함