Juni_Dev_log

(인프런) 파이썬 알고리즘 문제1-5 "정다면체" 본문

CodingTest/인프런 (Algorithm)

(인프런) 파이썬 알고리즘 문제1-5 "정다면체"

Juni_K 2021. 2. 16. 21:21

정다면체

Problem

 

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

 

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

 

▣ 입력설명

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

 

▣ 출력설명

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

 

▣ 입력예제

4 6

 

▣ 출력예제

5 6 7

 

💯 Solution ①

: Only My Thinking

 

- 두 주사위를 굴려서 나온 수들의 합을 담는 배열 sum_list 를 만든다.

- 이중 for 문을 통해서 두 주사위에서 나온 수들의 합을 sum_list에 넣는다.

- 오름차순으로 나와야하기때문에 sort()를 해준다.

- sum_list에서 나온 합들을 딕셔너리 형태로 만들기 위해서 sum_cnt 라는 딕셔너리를 만든다.

ex) sum_cnt : {1:2, 2:3, 3:4} // 1은 2번 나왔고, 2는 3번 나왔고, 3은 4번 나왔다.

- 해당 딕셔너리 형태를 만들기 위해서 sum_list를 for문과 if문을 사용해서 sum_cnt[i]=1 / sum_cnt[i]+=1 등으로 결과를 나눈다.

- 해당 딕셔너리에서 가장 큰 value를 구하고, 해당 value값을 가지고 있는 딕셔너리의 키값을 구해서 출력한다.

(출력할 때는 배열 형태로 나오기 때문에, join()과  map() 을 사용해서 문자열화 시켜서 띄어쓰기를 join하여 출력한다.)

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
32
33
34
35
36
37
38
import  sys
sys.stdin=open('input.txt','rt')
 
n, m=map(int, input().split())
# N,M의 주사위에서 나올 수 있는 숫자의 합을 모은 리스트
sum_list = []
# 정N면체에서 나올 수 있는 수
for i in range(1,n+1):
    # 정M면체에서 나올 수 있는 수
    for j in range(1,m+1):
        sum = i+j
        # 합 리스트에 추가
        sum_list.append(sum)
# sum_list 오름차순 정렬
sum_list.sort()
# sum_cnt 딕셔너리 생성
sum_cnt=dict()
 
# 해당 딕셔너리의 갯수를 파악해서 key:value형태로 만들기
for k in sum_list:
    if k not in sum_cnt.keys():
        sum_cnt[k]=1
    else:
        sum_cnt[k]+=1
 
# sum_cnt에서 가장 큰 value 값 찾기
lot_sum_cnt=max(sum_cnt.values())
 
# 결과 배열 만들기
result=[]
# sum_cnt 딕셔너리에서 가장 큰 value값을 가지는 key값을 result에 추가
for key,value in sum_cnt.items():
    if(value==lot_sum_cnt):
        result.append(key)
 
# result 리스트를 문자열로 변환해서 하나씩 출력
print(' '.join(map(str,result)))
 
cs

 

 

💯 Solution ②

: Tutor advice

 

- 임의의 가장 작은 값을 max의 초기값으로 설정

- 인덱스 번호를 합으로 나온 수를 설정

ex) 1 (정사면체에서 나온 수) + 2 (정육면체에서 나온 수) = 3 (배열의 인덱스 3번에 +1 추가)

- 그렇게 만들어진 cnt 배열을 for문을 돌려서 임의로 설정한 max와 비교해서 max값을 계속해서 갱신하는 식으로 배열의 최대값을 구한다.

- for문을 통해서 cnt 배열의 최대값 max를 만들었다면, max 값이 들어가있는 인덱스 번호를 구해서 print하면 된다.

: if cnt[i] == max: print(i, end=" ")

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import sys
sys.stdin=open("input.txt","r")
n, m=map(int, input().split())
cnt=[0]*(n+m+3)
# max는 가장 작은 값으로 설정
max=-2147000000
for i in range(1, n+1):
    for j in range(1, m+1):
        #눈의 합, 숫자가 나타날 때마다 해당 인덱스에 값이 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=" ")
cs

 

 

 

📚 참고

 

dojang.io/mod/page/view.php?id=2308

 

파이썬 코딩 도장: 25.2 반복문으로 딕셔너리의 키-값 쌍을 모두 출력하기

이번에는 딕셔너리와 for 반복문을 사용하여 간단하게 모든 키-값 쌍을 출력해보겠습니다. >>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40} >>> for i in x: ...     print(i, end=' ') ... a b c d for i in x:처럼 for 반복문

dojang.io

www.delftstack.com/ko/howto/python/how-to-convert-a-list-to-string/

 

파이썬에서리스트를 문자열로 변환하는 방법

이 튜토리얼은 파이썬에서리스트를 문자열로 변환하는 방법을 보여줍니다

www.delftstack.com

 

Comments