Practice/알고리즘

파이썬 알고리즘 : 정다면체

밍미a 2022. 11. 17. 01:07
728x90

오늘 배운 내용

더보기

정다면체 문제:




내가 생각한 문제풀이 : 

이 문제는 문제 자체가 이해가 잘 안된다.

n,m = map(input().split())  으로 n과 m의 값을 받아오고

던져서 나올 수 있는 눈의 합을 구해야 하니까..

n 과 m의 눈을 각각 배열로 만들어 줘야 할 것 같다. 

n이 4일경우 눈은 [1,2,3,4] 이렇게 될 것 같고 m이 6일경우 m의 눈은 [1,2,3,4,5,6] 이 될텐데..

이 둘의 눈을 각각 더해야 하는데.. 이중 for문을 사용해야 하나? 그.. 확률을 어떻게 구하는지 모르겠다..

저번에 K번째 큰 수 했을때랑 비슷할 것 같기도 하고.. 도저히 감이 오질 않는다...

 

더보기

정답코드:

 

# 입력 예제 : 4 6

n, m = map(int, input().split())
cnt = [0]*(n+m+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= ' ')

 

더보기

코드 분석:

알고리즘 풀 때 문제를 어떻게 해석하냐도 굉장히 중요한 요소이다.

위의 문제는 두개의 주사위가 주어질 때, 눈금의 합 중에서 가장 여러번 나온 숫자가 어떤것인지 찾는 문제이다.

표로 나타내자면 다음과 같다.

 

# 입력 예제 : 4 6

n, m = map(int, input().split())
cnt = [0]*(n+m+3)
max = -2147000000
for i in range(1,n+1): #n+1 까지 해야 n까지 돌게된다. 왜냐하면 range() 함수는 0부터 n-1까지 도니까.. range(4)하면 0,1,2,3 이렇게 돔.
    for j in range(1,m+1): #주사위 눈이 1부터 시작하니까 1부터 돌아야 한다.
        cnt[i+j] += 1 #주사위 두 눈의 합을 인덱스로 갖는 자리에 카운트를 하나씩 올린다.
for i in range(n+m+1): 
    if cnt[i] > max: #카운트 된 값이 max 보다 크면
        max = cnt[i] #max 변수에 cnt 카운트 된 값을 넣어준다.

for i in range(n+m+1): #나올 수 있는 최대의 값에서
    if cnt[i] == max: # max 값과 비교해서 가장 많이 나온 값들을 출력해준다.
        print(i, end= ' ')

 

사실 코드를 분석해도 코드가 어떻게 돌아가는지 정확하게 이해하기가 어려워서

그림으로 그려서 차근차근 생각해 봤더니 이해할 수 있었다.

다음은 코드를 이해하기 위해 그렸던 그림을 첨부한다.

 

 


느낌점

문제를 처음 읽었을 때 문제를 읽고 해석하는 연습이 많이 필요할 것 같다. 

오늘처럼 몇번을 읽어도 무슨 말인지 조차 이해가 되지 않으면 코드를 적어볼 시도조차 할 수 없다..

특히 해설 코드를 보더라도 해석해내는 힘이 부족해서

코드 하나하나 뜯어가며 손으로 그려서 겨우 이해를 했다.

문제 이해력을 많이 높히려면... 그냥 무작정 많이 풀이해보는 수 밖에 없나...?

 

알고리즘 풀 때에는 규칙성을 찾는것이 중요하다. 

코드를 짤때는 최대한 리소스를 줄이면서 짜는 연습을 해야한다...!

이중포문 없이 충분히 풀 수 있다..!