여니의 취준 준비/코딩테스트 (Python)

[n20436] ZOAC 3 in python

여니's 2021. 5. 21. 22:43

[2022. 02. 23 다시 품]

> 딕셔너리를 이용해서 구할 수 있음! 

 

sL, sR = input().split()
inp_str = list(input())

left_keybord = {'q': (0, 0), 'w': (0, 1), 'e': (0, 2), 'r': (0, 3), 't': (0, 4), 'a': (1, 0), 's': (1, 1), 'd': (1, 2),
                'f': (1, 3), 'g': (1, 4), 'z': (2, 0), 'x': (2, 1), 'c': (2, 2), 'v': (2, 3)}
right_keybord = {'y': (0, 5), 'u': (0, 6), 'i': (0, 7), 'o': (0, 8), 'p': (0, 9), 'h': (1, 5), 'j': (1, 6), 'k': (1, 7),
                 'l': (1, 8), 'b': (2, 4), 'n': (2, 5), 'm': (2, 6)}

lx, ly = left_keybord[sL]
rx, ry = right_keybord[sR]

answer = 0
cnt=0
for str in inp_str:
    if str in left_keybord:  # 왼쪽
        nx, ny = left_keybord[str][0], left_keybord[str][1]
        answer += abs(nx - lx) + abs(ny - ly)
        lx, ly = nx, ny
        cnt+=1
        continue
    else:  # 오른쪽
        nx, ny = right_keybord[str][0], right_keybord[str][1]
        answer += abs(nx - rx) + abs(ny - ry)
        rx, ry = nx, ny
        cnt+=1
print(answer+cnt)

# 첫 번째 풀이

> 자음, 모음을 x,y로 구분하면 되는데 ㅠㅠ 바보 같이 딕셔너리에 대입해서 사용함.

dict = [
    {'q': 'ㅂ', 'w': 'ㅈ', 'e': 'ㄷ', 'r': 'ㄱ', 't': 'ㅅ', 'y': 'ㅛ', 'u': 'ㅕ', 'i': 'ㅑ', 'o': 'ㅐ', 'p': 'ㅔ'},
    {'a': 'ㅁ', 's': 'ㄴ', 'd': 'ㅇ', 'f': 'ㄹ', 'g': 'ㅎ', 'h': 'ㅗ', 'j': 'ㅓ', 'k': 'ㅏ', 'l': 'ㅣ'},
    {'z': 'ㅋ', 'x': 'ㅌ', 'c': 'ㅊ', 'v': 'ㅍ', 'b': 'ㅠ', 'n': 'ㅜ', 'm': 'ㅡ'}
]

all_list = [
    ['ㅂ', 'ㅈ', 'ㄷ', 'ㄱ', 'ㅅ', 'ㅛ', 'ㅕ', 'ㅑ', 'ㅐ', 'ㅔ'],
    ['ㅁ', 'ㄴ', 'ㅇ', 'ㄹ', 'ㅎ', 'ㅗ', 'ㅓ', 'ㅏ', 'ㅣ'],
    ['ㅋ', 'ㅌ', 'ㅊ', 'ㅍ', 'ㅠ', 'ㅜ', 'ㅡ']
]

sl, sr = input().split()


def find_current_location(i):
    for j in range(3):
        if i in dict[j]:
            x = j
            y = all_list[j].index(dict[j][i])
    return x, y


slx, sly = find_current_location(sl)  # 왼손 현위치
srx, sry = find_current_location(sr)  # 오른손 현위치
answer = 0

for i in input():
    x, y = find_current_location(i)
    if ((x == 0 or x == 1) and y < 5) or (x == 2 and y < 4):  # 자음
        # 이동
        answer += abs(slx - x) + abs(sly - y)
        slx = x
        sly = y
        # 누르기
        answer += 1
    else: #모음
        # 이동
        answer += abs(srx - x) + abs(sry - y)
        srx = x
        sry = y
        # 누르기
        answer += 1

print(answer,end='')

# 두 번째 풀이

> 자음, 모음 일치시키지 않고도 할 수 있는 방법을 찾아냄!

keyboard = [['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p'],
            ['a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l'],
            ['z', 'x', 'c', 'v', 'b', 'n', 'm']]

sl, sr = input().split()


def find_current_location(s):
    for i, key in enumerate(keyboard):
        if s in key:
            return i, key.index(s)
    return None


slx, sly = find_current_location(sl)  # 왼손 현위치
srx, sry = find_current_location(sr)  # 오른손 현위치
answer = 0

for i in input():
    x, y = find_current_location(i)
    if ((x == 0 or x == 1) and y < 5) or (x == 2 and y < 4):  # 자음
        # 이동
        answer += abs(slx - x) + abs(sly - y)
        slx = x
        sly = y
        # 누르기
        answer += 1
    else:  # 모음
        # 이동
        answer += abs(srx - x) + abs(sry - y)
        srx = x
        sry = y
        # 누르기
        answer += 1

print(answer, end='')

# enumerate는 열거하다라는 뜻으로,

인덱스 값을 포함하는 enumerate 객체를 돌려준다.

(for문과 주로 사용된다.)

'여니의 취준 준비 > 코딩테스트 (Python)' 카테고리의 다른 글

[n2615] 오목 (in python)  (0) 2021.05.26
[n17413] 단어 뒤집기 2 (in python)  (0) 2021.05.25
[n20291] 파일 정리  (0) 2021.05.21
[n10994] 별 찍기 - 19  (0) 2021.05.21
[n1244] 스위치 켜고 끄기  (0) 2021.05.21