백준 20436번 ZOAC 3
1. 문제
이 문제는 쿼티 자판에서 타자를 칠 때 걸리는 시간의 최솟값을 구하는 문제이다.
키를 누르는 데 1의 시간이 걸리고 이동하는 데 두 좌표의 거리 (직선 거리 말고 택시 거리) 만큼의 시간이 걸린다.
독수리 타법, 즉, 양손의 손가락을 하나씩만 사용하는 타법이고 왼손과 오른손은 한글 자음 모음의 위치로 구분한다.
2. 풀이
조금 귀찮은 구현 문제였다.
쿼티식 키보드에 있는 모든 문자, 즉 알파벳 26개를 모두 배열에 넣어야했다.
거리 계산의 간편함을 위해 가장 아래 왼쪽에 있는 'Z'를 (0,0)이라고 생각해서
큰 배열 안에 3개의 줄이 있는 이중배열 구조로 키보드를 표현했다.
입력값은 모두 좌표가 아닌 문자로 주어지기 때문에 이걸 좌표로 바꾸는 함수를 만들었다.
coordinate 함수에 문자를 넣으면 키보드 배열의 인덱스를 찾아 좌표를 리턴한다.
입력을 받은 문자를 좌표로 바꾸어주고 각 문자에 대한 시간을 계산했다.
오른손과 왼손을 구분하기 위해 조건문을 사용했다.
키보드의 0번째 줄에서 4번째 칸 이상인 경우와
전체 줄에서 5번째 칸 이상인 경우에는 오른손을 움직인다.
입력하는 데 걸리는 시간 1까지 더해서 반복문을 돌렸다.
문자마다 시간을 계산하여 sum 변수에 더하고 최종적으로 이 값을 출력하였다.
3. 코드
#좌표 구하는 함수
def coordinate(char):
for i in range(3):
if char in keyboard[i]:
j = keyboard[i].index(char)
return (i, j)
#쿼터식 키보드 이중 배열
keyboard = [['z', 'x', 'c', 'v', 'b', 'n', 'm'], ['a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l'], ['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p']]
#입력
l, r = map(str, input().split())
string = str(input())
#입력된 문자 좌표로 바꾸기
now = [coordinate(l), coordinate(r)]
word = [coordinate(i) for i in string]
sum = 0 #시간
#모든 문자에 대해 시간 계산
for char in word:
if (char[0] == 0 and char[1] >= 4) or char[1] >= 5: #오른손으로 입력하는 경우
sum += abs(now[1][0] - char[0]) + abs(now[1][1] - char[1]) + 1
now[1] = char
else: #왼손으로 입력하는 경우
sum += abs(now[0][0] - char[0]) + abs(now[0][1] - char[1]) + 1
now[0] = char
print(sum) #출력
4. 결과
'Programming > Algorithm' 카테고리의 다른 글
[백준/python] 3980번 선발 명단 (0) | 2024.05.04 |
---|---|
[알고리즘] 백트래킹 Backtracking (0) | 2024.05.03 |
[백준/python] 9081번 단어 맞추기 (0) | 2024.05.03 |
[백준/python] 11055번 가장 큰 증가 부분 수열 (0) | 2024.05.02 |
[백준/python] 21918번 전구 (0) | 2024.04.30 |