우당탕탕 파이썬 with 하루하나 알고리즘

백준 5622 파이썬 - 문자의 다이얼 위치 찾기!

hyxndy 2022. 4. 10. 09:14

백준 5622번 - 다이얼 with Python

Q. 상근이의 할머니는 아래 그림과 같이 오래된 다이얼 전화기를 사용한다.

전화를 걸고 싶은 번호가 있다면, 숫자를 하나를 누른 다음에 금속 핀이 있는 곳 까지 시계방향으로 돌려야 한다. 숫자를 하나 누르면 다이얼이 처음 위치로 돌아가고, 다음 숫자를 누르려면 다이얼을 처음 위치에서 다시 돌려야 한다.

숫자 1을 걸려면 총 2초가 필요하다. 1보다 큰 수를 거는데 걸리는 시간은 이보다 더 걸리며, 한 칸 옆에 있는 숫자를 걸기 위해선 1초씩 더 걸린다.

상근이의 할머니는 전화 번호를 각 숫자에 해당하는 문자로 외운다. 즉, 어떤 단어를 걸 때, 각 알파벳에 해당하는 숫자를 걸면 된다. 예를 들어, UNUCIC는 868242와 같다.

할머니가 외운 단어가 주어졌을 때, 이 전화를 걸기 위해서 필요한 최소 시간을 구하는 프로그램을 작성하시오.

 

입력> 첫째 줄에 알파벳 대문자로 이루어진 단어가 주어진다. 단어의 길이는 2보다 크거나 같고, 15보다 작거나 같다.

출력> 첫째 줄에 다이얼을 걸기 위해서 필요한 최소 시간을 출력한다.

 

https://www.acmicpc.net/problem/5622

 

5622번: 다이얼

첫째 줄에 알파벳 대문자로 이루어진 단어가 주어진다. 단어의 길이는 2보다 크거나 같고, 15보다 작거나 같다.

www.acmicpc.net


이번에도 혼자 풀어서 맞긴 맞았는데 뭔가 찝찝해서 구글링해봤더니 역시나,,ㅎㅎㅎ

내가 했던 방법보다 더 쉬운 방법이 있었다. 그래서 두 개의 방법을 소개하려고 한다.

 

alphaNum = [3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,8,8,8,8,9,9,9,10,10,10,10]
    
wordNum = list(input())
sum = 0
for i in wordNum:
    for j in range(len(alphaNum)):
       if((ord(i)-65) == j):
          sum +=alphaNum[j]
print(sum)

이것은 내가 짰던 코드이다. 문자를 어떻게 다이얼 번호에 해당하는 숫자로 저장을 해야하나 하다가

그냥 내가 일일히 숫자를 list에 저장했다(저 값은 다이얼 넘버 + 1을 한 값들이다).

 

그래서 알파벳에 해당하는 다이얼 번호 +1을 alphaNum에 저장해놓고,

wordNum에 단어를 쪼개어 list로 저장한 후

아스키코드를 활용해서 코드를 짜봤다.

wordNum의 다이얼 번호 +1한 값의 인덱스는 A~Z까지의 인덱스와 동일하다.(A의 인덱스 = 0, Z의 인덱스 = 25)

예를 들어, A의 아스키코드는 65이다. 그렇다면, (A의 아스키코드) - 65 = 0이 된다.

각 아스키코드에 65를 빼주면 wordNum의 인덱스(=A~Z의 인덱스)와 같아진다.

같아지게 하는 인덱스를 찾아 이 인덱스를 출력해주었다.

 

이 코드를 짜면서 이상하다고 느꼈던 부분은 alphaNum을 생성하는 것이었다. 뭔가 저렇게 숫자를 직접 쳐서 저장하면 안될 거 같은 기분..? 그래서 찾아본 코드는 아래와 같다.

 

alphaList = ['ABC','DEF','GHI',"JKL","MNO",'PQRS','TUV','WXYZ']
count = 0
word = input()
for alpha in alphaList:
    for i in alpha:
        for x in word:
            if(x == i):
                count += alphaList.index(alpha) + 3
print(count)

처음 보면 for문이 3개에 if문까지 활용되고 있어서 해석하기 어려울 줄 알았는데, 차근차근 보면 오히려 이해가 쉽다.

 

먼저 alphaList를 위와 같이 받아주고,

word를 입력해준다.

첫 번째 for문을 통해 list의 각 요소들('ABC', 'DEF'...-> alpha)등을 하나씩 꺼내준다.

두 번째 for문을 통해 각 요소들('ABC', 'DEF'...-> alpha)을 또 분리하여 알파벳 하나하나씩으로 꺼내준다.

세 번째 for문을 통해 word의 알파벳도 하나하나씩 분리한다.

 

이 분리된 알파벳들이 서로 같으면,

alphaList에서 그 알파벳이 있는 인덱스를 찾고, 그 인덱스에 3을 더해준다.