본문 바로가기

컴퓨터과학/Algorithm

[Python] [백준] 1233번 주사위

 

1233번: 주사위

지민이는 주사위 던지기 게임을 좋아하여 어느 날 옆에 있는 동호를 설득하여 주사위 던지기 게임을 하자고 하였다. 총 3개의 주사위가 있다. 그리고 이 주사위는 각각 S1(2 ≤ S1 ≤ 20), S2(2 ≤ S2

www.acmicpc.net

문제

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

코드

S1, S2, S3 = map(int, input().split())
lst = [0]*(S1+S2+S3+1)
for i in range(1, S1+1):
    for j in range(1, S2+1):
        for k in range(1, S3+1):
            lst[i+j+k] += 1
print(lst.index(max(lst)))

 

설명

리스트의 인덱스를 활용하여 '가장 많이 발생하는 합'을 측정하였다. 예를 들어, 주사위의 합이 3이라면, 리스트 세 번째에 1을 더해 빈도를 계산하였다. 주사위의 합이 3, 4, 5, 5, 5... 라면, 리스트는 [0, 0, 0, 1, 1, 3...] 식이 되겠다. 이런 프로세스를 거친 후, 리스트의 최댓값을 구해 그것의 인덱스 값을 돌려주면 된다.

리스트는 0부터 숫자를 세는 것이 주의할 점이다. 예제처럼, 주사위 면의 수가 각각 3, 2, 3이라면 주사위 최대합은 8이 되지만, 8만큼의 리스트를 만들면 리스트의 인덱스는 0부터 7까지만 존재하게 된다. 따라서 +1을 해주어 최댓값에 해당하는 인덱스를 만들어주고 인덱스 0은 사용하지 않았다.