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

전화를 걸고 싶은 번호가 있다면, 숫자를 하나를 누른 다음에 금속 핀이 있는 곳 까지 시계방향으로 돌려야 한다. 숫자를 하나 누르면 다이얼이 처음 위치로 돌아가고, 다음 숫자를 누르려면 다이얼을 처음 위치에서 다시 돌려야 한다.
숫자 1을 걸려면 총 2초가 필요하다. 1보다 큰 수를 거는데 걸리는 시간은 이보다 더 걸리며, 한 칸 옆에 있는 숫자를 걸기 위해선 1초씩 더 걸린다.
상근이의 할머니는 전화 번호를 각 숫자에 해당하는 문자로 외운다. 즉, 어떤 단어를 걸 때, 각 알파벳에 해당하는 숫자를 걸면 된다. 예를 들어, UNUCIC는 868242와 같다.
할머니가 외운 단어가 주어졌을 때, 이 전화를 걸기 위해서 필요한 최소 시간을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 알파벳 대문자로 이루어진 단어가 주어진다. 단어의 길이는 2보다 크거나 같고, 15보다 작거나 같다.
출력
첫째 줄에 다이얼을 걸기 위해서 필요한 최소 시간을 출력한다.
코드
a=input()
alphabet=[["A","B","C"],["D","E","F"],["G","H","I"],["J","K","L"],["M","N","O"],["P","Q","R","S"],["T","U","V"],["W","X","Y","Z"]]
nlist=[]
for i in alphabet:
for j in range(len(a)):
if a[j] in i:
nlist.append(alphabet.index(i)+3)
print(sum(nlist))
코드 설명
a=input()
alphabet=[["A","B","C"],["D","E","F"],["G","H","I"],["J","K","L"],["M","N","O"],["P","Q","R","S"],["T","U","V"],["W","X","Y","Z"]]
nlist=[]
입력받은 단어를 변수 a에 넣습니다.
숫자별로 담당하는 알파벳이 있는데, 이를 2차 배열로 만들어 변수 alphabet에 넣습니다.
입력된 단어의 각 알파벳 별로 걸리는 시간들을 담을 빈 배열 nlist를 만듭니다.
for i in alphabet:
for j in range(len(a)):
if a[j] in i:
nlist.append(alphabet.index(i)+3)
중첩 for문을 사용해서 단어의 j번째 알파벳이 배열i에 담겨있다면,
nlist에 배열 i가 alphabet이라는 2차배열에서 갖는 인덱스 값 + 3을 한 값을 추가시켜줍니다.
+3 하는 이유 : 숫자 1을 걸려면 2초, 숫자 2를 걸려면 3초, 숫자 3을 걸려면 4초 ..., 숫자 9를 걸려면 10초 가 필요합니다.
하지만 숫자 2가 담당하는 알파벳이 있는 배열의 인덱스는 0, 숫자 3이 담당하는 알파벳이 있는 배열의 인덱스는 1... 이므로, 인덱스 값과 글자별로 번호를 입력하는데 드는 시간의 차이가 3이 생기게 되어 3을 더해주는 것입니다.
print(sum(nlist))
nlist에 담긴 숫자들을 더해서 출력해줍니다.
관련 개념 정리
input
파이썬에서는 값을 사용자로부터 입력받을때 input함수를 사용합니다.
입력받은 값을 넣을 변수 이름 = input("띄울 메세지")
단! input함수는 입력받은 모든 내용을 문자열로 인식합니다. 따라서 입력받은 내용을 정수로 변환하려면
d = int(input())
와 같은 형태로 작성하거나, 나중에 변수를 사용할때
print(int(d)+2)
와 같이 int()로 감싸서 작성할 수 있습니다.
for문
특정 코드들을 원하는 횟수 만큼 반복 시킬 때 사용하는것이 for문입니다.
for문의 기본 구조는 아래와 같습니다.
for i in 리스트(or 문자열, 튜플):
실행할 코드
리스트,문자열,튜플의 첫 글자나 요소부터 마지막 글자나 요소까지 차례대로 변수에 대입됩니다.
for문의 범위와 변수값을 숫자로 정하고 싶을때는 아래와 같이 range함수를 사용합니다.
for i in range(시작숫자,종료숫자,step):
실행할 코드
step은 얼만큼씩 변수를 증가 시킬지 정하는 것 입니다.
시작숫자와 step은 생략되어도 됩니다.
i를 사용하지 않고 코드를 반복만 하고 싶은 경우, i자리를 _(언더바)로 대체해서 사용합니다.
append
append함수는 리스트의 마지막에 사용자가 원하는 요소를 추가하는 함수입니다.
리스트.append(추가 할 요소)
위와 같은 형태로 사용 가능합니다.
if문
<조건> 하면, <코드>를 실행하고 싶을때 쓸 수 있는것이 바로 if문입니다.
기본적인 형태는 아래와 같습니다.
if 조건문 1:
실행 코드 1 ...
elif 조건문 2:
실행 코드 2 ...
else:
실행 코드 3 ...
해석을 하자면, 조건문 1을 충족하면 실행 코드 1을 실행하고, 그게 아닌 조건문 2를 충족하면 실행 코드 2를 실행한다.
조건문 1과 조건문 2를 모두 충족하지 않으면 실행 코드 3을 실행한다. 입니다.
elif와 else는 필수는 아닙니다.
index
반복 가능한 자료형 속에 특정 값이 어떤 인덱스에 존재하는지를 구할때 사용합니다.
반복 가능한 자료형.index(찾을요소)
'코딩공부 > 알고리즘' 카테고리의 다른 글
[파이썬 풀이] 백준 1712. 손익분기점 (0) | 2021.12.05 |
---|---|
[파이썬 풀이] 백준 2941.크로아티아 알파벳 (0) | 2021.12.05 |
[파이썬 풀이] 백준 2908.상수 (0) | 2021.12.05 |
[파이썬 풀이] 백준 1152.단어의 개수 (0) | 2021.12.01 |
[파이썬 풀이] 백준 1157.단어 공부 (0) | 2021.12.01 |