메모리: 31256 KB, 시간: 44 ms
구현, 시뮬레이션
2020년 12월, 세 번째로 개최된 ZOAC의 오프닝을 맡은 성우는 누구보다 빠르게 ZOAC를 알리려 한다.
하지만 안타깝게도 성우는 독수리타법이다!
바쁜 성우를 위하여 해당 문자열을 출력하는 데 걸리는 시간의 최솟값을 구해보자.
첫 번째 줄에는 두 알파벳 소문자 sL, sR이 주어진다. sL, sR은 각각 왼손 검지손가락, 오른손 검지손가락의 처음 위치이다.
그 다음 줄에는 알파벳 소문자로 구성된 문자열이 주어진다. 문자열의 길이는 최대 100자이다. 빈 문자열은 주어지지 않는다.
입력으로 주어진 문자열을 출력하는 데에 걸리는 시간의 최솟값을 출력한다.
딕셔너리를 선언해서 키에 대한 정보를 다 저장해놓았다.
딕셔너리의 키를 키보드의 키로 선언하여 안에 어느 검지손가락을 사용해야 하는지, 키보드의 위치를 행과 열로 각각 저장해놓았다.
문자열을 하나씩 돌면서 해당하는 값에 맞게 cnt를 증가시키고, sl 혹은 sr를 갱신시켰다.
import sys
sl, sr = sys.stdin.readline().rstrip().split()
data = list(sys.stdin.readline().rstrip())
# 키에 맞는 정보 딕셔너리 (어느 검지손가락인지, 행, 열)
which_hand = {
'q':('l',0,0),
'w':('l',0,1),
'e':('l',0,2),
'r':('l',0,3),
't':('l',0,4),
'a':('l',1,0),
's':('l',1,1),
'd':('l',1,2),
'f':('l',1,3),
'g':('l',1,4),
'z':('l',2,0),
'x':('l',2,1),
'c':('l',2,2),
'v':('l',2,3),
'y':('r',0,5),
'u':('r',0,6),
'i':('r',0,7),
'o':('r',0,8),
'p':('r',0,9),
'h':('r',1,5),
'j':('r',1,6),
'k':('r',1,7),
'l':('r',1,8),
'b':('r',2,4),
'n':('r',2,5),
'm':('r',2,6),
}
cnt = 0
# 문자를 하나씩 돌면서 계산
for alpha in data:
# 문자를 좌측 검지 손가락으로 눌러야 하는지 확인
if which_hand[alpha][0] == 'l':
# 택시 거리만큼 cnt 증가
cnt += abs(which_hand[alpha][1] - which_hand[sl][1]) + abs(which_hand[alpha][2] - which_hand[sl][2])
# 키를 누르는 시간 1만큼 cnt 증가
cnt += 1
sl = alpha
else: # 우측 검지 손가락인 경우
cnt += abs(which_hand[alpha][1] - which_hand[sr][1]) + abs(which_hand[alpha][2] - which_hand[sr][2])
cnt += 1
sr = alpha
print(cnt)