[오늘의 문제] 주사위

shlim55·2025년 12월 21일

코딩테스트

목록 보기
201/223

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

문제
지민이는 주사위 던지기 게임을 좋아하여 어느 날 옆에 있는 동호를 설득하여 주사위 던지기 게임을 하자고 하였다. 총 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
3 2 3
예제 출력 1
5

내가 한 풀이

S1, S2, S3 = map(int, input().split())

def Solution(S1, S2, S3):
    '''
    주사위1은 S1(3)개의 면이 있으므로 1, 2, 3의 눈을 가지고
    , 주사위2는 S2(2)개의 면이 있으므로 1, 2의 눈을 가지며
    , 주사위3은 S3(3)개의 면이 있으므로 1, 2, 3의 눈을 가진다
    '''
    # 가장 많이 발생하는 합을 구하는 것이다.
    # 빈도수 저장 = 딕셔너리 사용
    dict1 = {}

    list_s1 = []
    list_s2 = []
    list_s3 = []
    # 리스트 화 
    for i in range(1, S1+1):
        list_s1.append(i)

    for i in range(1, S2+1):
        list_s2.append(i)

    for i in range(1, S3+1):
        list_s3.append(i)

    
    for x in list_s1:
        for y in list_s2:
            for z in list_s3:
                # print(x, y, z)
                sum = x + y + z
                if sum in dict1:
                    dict1[sum] += 1 # 원래 저장된 합(키)이면 +1
                else:
                    dict1[sum] = 1 # 키값이 없다면 1저장

    # 반복문을 써서 찾아본다.
    answer = 0
    max_freq = 0

    # dict1의 키(합)들을 작은 순서대로 확인
    for s in sorted(dict1.keys()): # 키 값 
        if dict1[s] > max_freq:
            max_freq = dict1[s]# 최대 빈도 갱신
            answer = s # 그때의 합 

    # max_value = max(dict1.values()) # 최다 빈도수인 키 값
    return answer

print(Solution(S1, S2, S3))

트러블 슈팅

맨첨에 zip 함수를 써서 리스트 세개를 순회하고자 했다.

하지만 그렇게 하면 1,1,1 2,2,2 3,3,3 이런식으로 순회하기 때문에

전체가 순회가 안된다.

그래서 자바 알고리즘 때처럼 반복문 3개를 순회하기로 함

그리고 dict1의 키들을 작은 순서대로 확인하는게

요구 사항을 제대로 파악못했음

최다 빈도수의 키 값을 반환해야 하는게 힘들었고, 첨에는

최다 빈도수만 반환했던거 같다.

profile
A Normal Programmer

0개의 댓글