박봉달의 개발생활
Today's Algoritm : 파이썬 알고리즘-5 정다면체 본문
파이썬 알고리즘에 대해서 정리해볼 예정이다. 기본부터 탄탄히 만들어가보려고 적어가는 과정.
알고리즘을 짜는데는 오래 걸리는데 막상 코드를 짜면 이렇게 짧은가 싶다.
문제 출처는 아래 벨로그에서!
https://velog.io/@jiffydev/algo-5
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 반복문을 짜서 비교했고 정답을 얻었다.
참고) 가장 큰 수 찾기 - 파이썬
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() 함수를 사용하여 큰 수를 뽑아내고 바로 비교가 가능해서 좋았다.
생각보다 어렵지는 않았지만 코드를 짜는 데 있어서 헷갈렸던 부분이 많았다. 나는 역시 천재는 아니어서 노오력이 필요한 것 같다!
'Projects > Algorithm' 카테고리의 다른 글
Today's Algoritm : 파이썬 알고리즘-12 (탐색)숫자만 추출 (0) | 2021.05.27 |
---|---|
Today's Algoritm : 파이썬 알고리즘-11 (탐색)회문 문자열 검사 (1) | 2021.05.25 |
Algoritm : Two Sum 두 정수의 합 구하기 / append(), 파이썬 화살표 -> 의미 (0) | 2021.03.20 |