코딩테스트

프로그래머스 - 키패드 누르기 (레벨1, swift)

momo_9 2020. 11. 18. 00:04

문제 출처
https://programmers.co.kr/learn/courses/30/lessons/67256

 

코딩테스트 연습 - 키패드 누르기

[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] "right" "LRLLLRLLRRL" [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] "left" "LRLLRRLLLRR" [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] "right" "LLRLLRLLRL"

programmers.co.kr

 

 

✨문제풀이

키패드는 상하좌우로만 움직일 수 있으니 키패드 숫자들의 상하좌우간 관계를 파악하면 되는 문제이다.

먼저 눌러야 하는 숫자가 1, 4, 7인 경우는 무조건 왼손이 3, 6, 9인 경우는 무조건 오른손이 누르게 된다.

문제는 다음 눌러야 하는 숫자가 2, 5, 8, 0인 경우이다.

이 경우에는 현재 왼손과 오른손이 위치한 키패드의 숫자를 중심으로, 눌러야 하는 숫자까지의 거리를 계산해서 거리가 더 짧은 곳에 있는 손이 해당 숫자를 누르도록 선택해야 한다. 이를 위해 키패드간 거리를 계산하는 방법을 찾아야하는 것이 이 문제의 핵심이다.

 

키패드의 숫자들을 살펴보면

좌우에 있는 숫자들끼리는 +1, -1씩 차이가 난다. 예) 4, 5, 6

상하에 있는 숫자들끼리는 +3, -3씩 차이가 난다. 예) 1, 4, 7

현재 손이 있는 곳과 다음 눌러야 하는 숫자의 차이를 3으로 나누어 그 몫과 나머지를 더하면 해당 거리를 구할 수 있다.

 

예를 들어 살펴보자

 

왼손 위치 오른손 위치 눌러야 할 숫자
1 9 8


왼손 위치(1) - 눌러야 할 숫자(8) = 7 (차이를 구하는 것이므로 절대값으로 계산한다)
왼손 위치와 눌러야 할 숫자의 차이(7) / 3 = 2...1
몫이 2이고 나머지가 1이므로 두 숫자를 더한 3이 키패드 1과 8의 거리값이 된다

 

오른손 위치(9) - 눌러야 할 숫자(8) = 1
1/ 3 = 0...1
몫이 0이고 나머지가 1이므로 두 숫자를 더한 1이 키패드 9와 8의 거리값이 된다

 

이런식으로 계산할 경우

키패드 숫자0을 11로 놓고 계산해야 한다.

또한 * 는 10, #는 12로 설정해주었다.

 

이렇게 계산 한 후, 거리 값이 작은 곳에 있는 손이 선택되도록 해주고 값이 같을 경우 hand에 따라 선택되도록 해주었다.

자세한 내용은 아래 코드를 보면 된다.