박봉달의 개발생활

Today's Algoritm : 파이썬 알고리즘-5 정다면체 본문

Projects/Algorithm

Today's Algoritm : 파이썬 알고리즘-5 정다면체

박봉달 2021. 4. 19. 14:40
728x90

파이썬 알고리즘에 대해서 정리해볼 예정이다. 기본부터 탄탄히 만들어가보려고 적어가는 과정.

알고리즘을 짜는데는 오래 걸리는데 막상 코드를 짜면 이렇게 짧은가 싶다.

문제 출처는 아래 벨로그에서!

https://velog.io/@jiffydev/algo-5

 

파이썬 알고리즘-5 정다면체

정다면체

velog.io


1. 문제

두 개의 정 N면체와 정 M면체의 두 개의 주사위를 던져서 나올 수 있는 눈의 합 중 가장 확률이 높은 숫자를 출력하는 프로그램을 작성하세요. 정답이 여러 개일 경우 오름차순으로 출력합니다.

▣ 입력설명

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

▣ 출력설명

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

▣ 입력예제 1

4 6

▣ 출력예제 1

5 6 7


2. 생각 과정

주사위 두개라는 의미는 아마 1 ~ N 또는 M 까지의 수가 기록되어있는 주사위라고 이해를 했다. 주사위 두개를 한번에 돌렸을 때 나올 수 있는 합 (예. 1과 4라고 하면 합은 5)중에 확률이 가장 높다는 것은 1과 4, 2와 3, 3과 2, 4와 1 처럼 모두 합이 5가 되는 주사위 조합이라고 생각했다.

for 문으로 각 정 N면체와 정M면체의 눈 수를 모두 돌아가면서 더하여 배열에 나올때마다 +1 을 하면서 세야하겠다 생각했다. 리스트를 만들었고, 0으로 초기화 시킨 후에 더한 합을 리스트의 인덱스에 맞춰서 갯수를 하나씩 추가시켜갔다.

마지막에 가장 큰 수 찾아서 그 수가 리스트에서의 수와 같다면 인덱스(i)를 출력해줄 수 있는 for 반복문을 짜서 비교했고 정답을 얻었다.

참고) 가장 큰 수 찾기 - 파이썬

https://wikidocs.net/10063

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

 

3. 내 코드

n, m = map(int, input().split())
my_data = [0]*(n+m+1)

for i in range(1, n+1):
    for j in range(1, m+1):
        hap = i + j
        my_data[hap] += 1  // 개수 증가
// print(my_data)   숫자 확인용

maxValue = max(my_data)
for i in range(0, len(my_data)-1):
    if maxValue == my_data[i]:
        print(i, end=' ')  // 정답 출력

 

4. 풀이 코드

n, m=map(int, input().split())
cnt=[0]*(n+m+3)
max=0
for i in range(1, n+1):
    for j in range(1, m+1):
        cnt[i+j]=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=' ')

 


5. 배운점

- N개의 리스트를 0 또는 다른 수로 초기화하는 방법 : [0]*(개수)

- 합이라고 한다면 0과 1은 나오지 않을테니 리스트에서 아예 제외시켜서 메모리공간을 조금 더 효율적으로 쓸 수 있지 않았을까 생각한다.

- 파이썬에서는 굳이 하나하나 비교할 필요 없이 max() 함수를 사용하여 큰 수를 뽑아내고 바로 비교가 가능해서 좋았다.

생각보다 어렵지는 않았지만 코드를 짜는 데 있어서 헷갈렸던 부분이 많았다. 나는 역시 천재는 아니어서 노오력이 필요한 것 같다!

728x90
반응형