python/백준_프로그래머스

[프로그래머스] 완전 탐색-모음 사전. 근데 이제 수학을 곁들인

소곡이 2023. 9. 17. 23:01
728x90

 

 


문제

https://school.programmers.co.kr/learn/courses/30/lessons/84512

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

코드
def createScore(num):
    score = [1]
    
    for i in range(num-1):
        score.append(score[i]*num+1)
    score.reverse()
    return score
        
def solution(word):
    score = [781,156,31,6,1]
    #score = createScore(5) # a,e,i,o,u

    answer = 0
    alphaToNum = list()
    
    for w in word:
        if w=='A':
            alphaToNum.append(1)
        elif w=='E':
            alphaToNum.append(2)
        elif w=='I':
            alphaToNum.append(3)
        elif w=='O':
            alphaToNum.append(4)
        elif w=='U':
            alphaToNum.append(5)

    for idx, n in enumerate(alphaToNum):
        answer+= (n-1)*score[idx] +1     
    
    return answer

 

 

 이거는 문제 해석하는게 조금 어려웠어요. AAAE다음에 AAAI인지 AAAEA인지 헷갈렸어요. 여러분들은 어떠셨나요?

 

 

 질문하기 보니까 AAAEA가 맞다고 하더라고요. 

 

 

이걸 보면 규칙이 있죠. 저는 이 규칙이 너무 알고 싶었어요. A->E가 781인 거는. 예제 중에 I가 1562길래. A의 번호인 1을 빼주고, /2했어요. 

 

 규칙은 이 친구의 도움이 있었습니다. 

 

답은 틀렸지만, 규칙은 알아냈죠

 

[781, 156, 31, 6, 1]
answer+= (n-1)*score[idx] +1  # AEIOU->12345

 

즉, A(1번)->E(2번)로 가는 것은 한 칸 이동한 것이므로, 781+1을 해주면 되고, A->I로 가는 것은 두 칸 이동한 것이므 781*2 +1을 해주면 되는 겁니다. 

 

EIO는 숫자로 바꾸면 234로 바꿀 수 있습니다. AAA(111)에서 123칸 씩 움직인 것이므로, 781*1 + 156*2 + 31*3을 해주면 되겠죠?

 

 5진수라 생각하면 편하실 것 같아요. 

 

번외

 

 다 풀고 다른 사람 풀이 보는데 누가 하드코딩으로 리스트에 싹 다 담아놓은거에요ㅋㅋㅋㅋㅋㅋㅋㅋㅋ 힘들게 풀어서 몸과 정신 망신창이인데. 저거 보고 빡빡 웃었습니다. 

 

 

코딩 계의 피라미드