[알고리즘] 정다면체
(문제) 정다면체
두 개의 정 N면체와 정 M면체의 두 개의 주사위를 던져서 나올 수 있는 눈의 합 중 가장 확률이 높은 숫자를 출력하는 프로그램을 작성하세요.
정답이 여러 개일 경우 오름차순으로 출력합니다.
입력설명
첫 번째 줄에는 자연수 N과 M이 주어집니다. N과 M은 4, 6, 8, 12, 20 중의 하나입니다.
출력설명
첫 번째 줄에 답을 출력합니다.
테스트케이스
입력예제 | 출력예제 |
---|---|
4 6 | 5 6 7 |
8 8 | 9 |
12 20 | 13 14 15 16 17 18 19 20 21 |
8 12 | 9 10 11 12 13 |
6 20 | 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
해결방법
방법 1 (반복문 이용)
-
정다면체1 과 정다면체2가 더해서 만들어 질 수 있는 값의 경우를 key 값으로 놓고 반복이 몇번이 일어나는 지를 value로 생각한다.
-
그 해시 테이블에서 value가 가장 큰 값을 찾아서 그 value 값을 가지고 있는 key들을 출력 한다.
방법 2 (순차적인 효과 이용)
-
규칙은 절대값(정다면체 1의 최대 경우의 수 - 정다면체 2의 최대 경우의 수) + 1
-
기준 작은 정다면체의 최대 경우의 수 + 1 부터 ~ 규칙 + small 까지의 경우들 출력
방법 코드 1
# 순차적 특징 이용하지 않고 알고리즘을 이용
n, m = map(int, input().split())
_sum = {}
# 값 해시로 사용
# 첫번째 정다면체
for i in range(1, n+1):
# 두번째 정다면체
for j in range(1, m+1):
# 각각 한번 씩 더하기
# 만약 더한 값이 해쉬 테이블에 있을 경우
if _sum.get(i+j):
# 값을 1 더한다
_sum[i+j] += 1
else:
# 값을 1로 초기화 한다
_sum[i+j] = 1
# 만약 _sum 의 해시테이블의 key에서
for key in _sum.keys():
# value 중 가장 큰 값이 해당 key에 대응하는 value일 경우 출력
if _sum[key] == max([k for k in _sum.values()]):
print(key, end=' ')
방법 코드 2
# 순차적인 특징 이용
n, m = map(int, input().split())
# 규칙은 절대값(정다면체 1의 최대 경우의 수 - 정다면체 2의 최대 경우의 수) + 1
rule = abs(n-m) + 1
# 기준은 작은 정다면체
small = min([n, m])
# 작은 정다면체 최대 경우의 수 + 1 부터 ~ 규칙 + small 까지의 경우들
k = list(range(small+1, small+rule+1))
# 값 출력
print(*k)
댓글남기기