백준 20436: ZOAC 3

Hapjeong Girl·2023년 4월 11일
0

BACKJOON

목록 보기
13/22
post-thumbnail

[Silver IV] ZOAC 3 - 20436

문제 링크

성능 요약

메모리: 31256 KB, 시간: 44 ms

분류

구현, 시뮬레이션

문제 설명

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

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

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

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

입력

첫 번째 줄에는 두 알파벳 소문자 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)
profile
프론트엔드 / 컴퓨터공학과 4학년

0개의 댓글