[백준]/python

[백준] ZOAC 3(20436) - python

0_TLS 2025. 2. 2. 16:26

문제

2020년 12월, 세 번째로 개최된 ZOAC의 오프닝을 맡은 성우는 누구보다 빠르게 ZOAC를 알리려 한다.

하지만 안타깝게도 성우는 독수리타법이다!

  • 독수리 타법이란 양 손의 검지손가락만을 이용해 타자를 치는 타법이다.
  • 성우는 한글 자음 쪽 자판은 왼손 검지손가락으로 입력하고, 한글 모음 쪽 자판은 오른손 검지손가락으로 입력한다.
  • a의 좌표가 (x1, y1)이고, b의 좌표가 (x2, y2)일 때, a에 위치한 성우의 손가락이 b로 이동하는 데에는 a와 b의 택시 거리 |x1-x2|+|y1-y2| 만큼의 시간이 걸린다.
  • 각 키를 누르는 데에는 1의 시간이 걸린다.
  • 성우는 두 손을 동시에 움직일 수 없다.
  • 성우가 사용하는 키보드는 쿼티식 키보드이며, 아래 그림처럼 생겼다.

바쁜 성우를 위하여 해당 문자열을 출력하는 데 걸리는 시간의 최솟값을 구해보자.

입력

첫 번째 줄에는 두 알파벳 소문자 sL, sR이 주어진다. sL, sR은 각각 왼손 검지손가락, 오른손 검지손가락의 처음 위치이다.

그 다음 줄에는 알파벳 소문자로 구성된 문자열이 주어진다. 문자열의 길이는 최대 100자이다. 빈 문자열은 주어지지 않는다.

출력

입력으로 주어진 문자열을 출력하는 데에 걸리는 시간의 최솟값을 출력한다.

예제 입력 1 

z o
zoac

예제 출력 1 

8

힌트

성우가 두 손을 동시에 움직이지 못하는 이유는 다음과 같다.

  • 사람은 두 가지 이상의 일을 동시에 할 수 없다.
  • 대학원생은 사람이다.
  • 성우는 대학원생이다.

💡아이디어

1. 키보드의 모든 좌표값을 딕셔너리 형태로 저장한다.

2. 왼손, 오른손의 초기 위치를 구하고, 한글 자음쪽 자판을 입력할때는 왼손이 움직인 거리(택시거리), 한글 모으쪽 자판을 입력할때는 오른손이 움직인거리(택시거리)를 구한다.

3. 키를 하나 누르고 나면 왼손, 오른손의 위치를 갱신한다.

4. 각 키를 누르는데 1의 시간이 걸리니까 기본적으로 전체 글자수만큼의 시간이 소요된다. 

4-1. 예를 들어 문자열이 apple이면 5만큼의 시간이, ZOAC이면 4만큼의 시간이 걸린다.

 

<코드>

import sys
input = sys.stdin.readline

left = ['q', 'w', 'e', 'r', 't', 'a', 's', 'd', 'f', 'g', 'z', 'x', 'c', 'v']
right = ['y', 'u', 'i', 'o', 'p', 'h', 'j', 'k', 'l', 'b', 'n', 'm']
keyboard = {'q':(0,0), 'w':(0,1), 'e':(0,2), 'r':(0,3), 't':(0,4), 'y':(0,5), 'u':(0,6), 'i':(0,7),
            'o':(0,8), 'p':(0,9), 'a':(1,0), 's':(1,1), 'd':(1,2), 'f':(1,3), 'g':(1,4), 'h':(1,5),
            'j':(1,6), 'k':(1,7), 'l':(1,8), 'z':(2,0), 'x':(2,1), 'c':(2,2), 'v':(2,3), 'b':(2,4),
            'n':(2,5), 'm':(2,6)}
sl, sr = map(str, input().split())
(x1, y1) = keyboard[sl]
(x2, y2) = keyboard[sr]
string = input().strip()
time = len(string)
for c in string:
    if c in left:
        (new_x1, new_y1) = keyboard[c]
        time += abs(new_x1-x1) + abs(new_y1-y1)
        x1, y1 = new_x1, new_y1
    elif c in right:
        (new_x2, new_y2) = keyboard[c]
        time += abs(new_x2-x2) + abs(new_y2-y2)
        x2, y2 = new_x2, new_y2
print(time)

 

결과