본문 바로가기
코딩테스트/Algorithm

[Algorithm][Python] 정다면체

by codeok 2021. 5. 13.
반응형

[문제]  K번째 큰 수

두 개의 정 N면체와 정 M면체의 두 개의 주사위를 던져서 나올 수 있는 눈의 합 중 가장 확
률이 높은 숫자를 출력하는 프로그램을 작성하세요.


정답이 여러 개일 경우 오름차순으로 출력합니다.

 

입력 설명

첫 번째 줄에는 자연수 N과 M이 주어집니다. N과 M은 4, 6, 8, 12, 20 중의 하나입니다.

 

출력 설명

첫 번째 줄에 답을 출력합니다.

 

입력예제 1

4 6

 

출력예제 1

5 6 7

 

문제 접근

  1. N과 M을 입력받고, N+M의 합은 주사위가 나올 수 있는 최대합이므로 N+M의 합의 갯수만큼 0의 값을 가지는 배열을 만들어준다.
  2. N과 M을 이중 for문을 돌면서 두 주사위의 합의 인덱스에 +=1 을 해준다.
  3. dice 배열을 for문을 돌려서 if max값과 같으면 출력한다.

 

풀이

 

나의 코드

N,M = map(int, input().split())
# (N + M)을 더하면 두 주사위의 최대합이다. 
# 주사위가 나올 수 있는만큼 0의 값을 가지는 1차원 배열을 만든다.
dice = [0 for _ in range(N+M)]

for i in range(1, N+1):
    for j in range(1, M+1):
        # 주사위의 합에 해당하는 인덱스에 1을 더해준다. 
        dice[i+j-1] += 1

for idx in range(len(dice)):
    # 각각의 배열을 돌면서 최댓값이면 즉, 확률이 높은 수들을 출력한다.
    if dice[idx] == max(dice):
        print(idx+1, end=' ')

 

 

정답 코드

  • 위의 나의 코드와 다른점은 2행에서 for문을 통해서 배열을 만들지 않고 그냥 연산을 통해서 만들었다.
  • 9행 : python의 내장 함수인 max를 사용하지 않고 구현을 했다.
n,m = map(int, input().split())
cnt = [0] * (n+m+3) # 조금 더 넉너가게 고냥 3을 더해준다.
max = -2147000000

for i in range(1, n+1):
    for j in range(1, m+1):
        cnt[i+j] += 1

for i in range(n+m+1):
    if cnt[i] > max:
        max = cnt[i]
        
for i in range(n+m+1):
    if cnt[i] == max:
        print(i, end=' ')
반응형