백준 5622번
문제
상근이의 할머니는 아래 그림과 같이 오래된 다이얼 전화기를 사용한다.
전화를 걸고 싶은 번호가 있다면, 숫자를 하나를 누른 다음에 금속 핀이 있는 곳 까지 시계방향으로 돌려야 한다. 숫자를 하나 누르면 다이얼이 처음 위치로 돌아가고, 다음 숫자를 누르려면 다이얼을 처음 위치에서 다시 돌려야 한다.
숫자 1을 걸려면 총 2초가 필요하다.
1보다 큰 수를 거는데 걸리는 시간은 이보다 더 걸리며, 한 칸 옆에 있는 숫자를 걸기 위해선 1초씩 더 걸린다.
상근이의 할머니는 전화 번호를 각 숫자에 해당하는 문자로 외운다.
즉, 어떤 단어를 걸 때, 각 알파벳에 해당하는 숫자를 걸면 된다. 예를 들어, UNUCIC는 868242와 같다.
할머니가 외운 단어가 주어졌을 때, 이 전화를 걸기 위해서 필요한 최소 시간을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 알파벳 대문자로 이루어진 단어가 주어진다. 단어의 길이는 2보다 크거나 같고, 15보다 작거나 같다.
출력
첫째 줄에 다이얼을 걸기 위해서 필요한 최소 시간을 출력한다.
나의 풀이
alphabet =[i for i in input()]
asc_list=[90, 86, 83]
n=82
for _ in range(5):
n -=3
asc_list.append(n)
numbers =[]
cnt = 11
for i in alphabet:
for j in asc_list:
if int(ord(i)) <= int(j) :
cnt -= 1
numbers.append(cnt)
cnt=11
print(sum(numbers))
일단 반복 작업을 하는것이 너무 싫었다.
그래서 최대한 반복 작업을 줄일려고 노력했다.
먼저 아스키 코드에서 A=65, Z=90 임을 ord()
를 이용해 알아냈다.
그런데 다이얼 이미지를 보니 알파벳이 3개씩 묶여 있는게 아닌 간혹 4개씩 묶여있는 것도 있었다.
해당 부분이 있는 영역은 리스트로 따로 묶어두고 그 다음 숫자부터는 for문을 이용하여 리스트를 채웠다.
이 짓을 5번이나 해야하는데 반복문 없이 이러한 행위를 하는 것은 지옥이다
그 후 이중 반복문을 이용하여 빈 리스트에 알파벳이 포함되는 수의 영역에 있으면 cnt를 1개씩 빼는 식으로 하여 계산했다.
다른 사람의 풀이
str = input()
ans = 0
alpabet=[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]
for s in str:
ans += alpabet[ord(s)-ord("A")]
print(ans)
리스트에 각 알파벳이 해당하는 번호를 기입하고 입력값의 아스키 표의 값과 A의 값을 빼면 그 알파벳에 해당하는 리스트의 인덱스 값을 얻을 수 있다.
그 값을 누적해서 더하여 값을 얻어냈다.
솔직히 이렇게 짜는게 시간을 덜 걸렸을 것 같다.
근데 나는 같은 값을 여러번 넣는게 너무 싫었다.
S = input()
alp = ['ABC','DEF','GHI','JKL','MNO','PQRS','TUV','WXYZ']
time = 0
for i in range(len(S)):
for k in range(8):
if S[i] in alp[k]:
time += k + 3
print(time)
이것도 비슷한 방식인듯 한데 훨씬 더 세련됐다.
먼저 같은 번호에 속하는 알파벳에 속하는 것끼리 묶어놓고 반복문에서 입력값의 알파벳 개수만큼 돌린다.
그 후 입력값을 처음부터 끝가지 순회하면서 alp의 묶음들을 다 대치한다.
그 후 python은 0부터 시작하고 문제에서 'ABC' , 즉 제일 낮은 묶음이 3부터 시작하니 +3을 해줬다.
str도 인덱싱이 되는지 몰랐다.