[알고리즘] Swift -프로그래머스 연습문제 #67256(2020 카카오 인턴십_키피드 누르기)
2023. 4. 22. 00:55ㆍALGORITHM/Swift
728x90
반응형
문제링크
분석
스마트폰 키패드에는 숫자들이 적혀있다.
왼손과 오른손 엄지손가락을 이용하여 숫자를 입력하려고 한다.
맨 처음 왼손 엄지손가락은 * 키패드, 오른손 엄지손가락은 # 키패드 위치에서 시작한다.
- 엄지손가락은 상하좌우 4가지 방향으로 이동할 수 있다. 키패드 한 칸 이동은 거리 1이다
- 왼쪽 3개의 숫자 1,4,7 은 왼손 엄지손가락을 사용한다.
- 오른쪽 3개의 숫자 3,6,9 는 오른손 엄지손가락을 사용한다.
- 가운데 열의 4개의 숫자 2,5,8,0 은 두 엄지손가락 중 가까운 엄지손가락을 사용한다.
- 두 엄지손가락의 거리가 같다면 오른손잡이는 오른손을, 왼손잡이는 왼손을 사용한다.
순서대로 누를 번호 배열과 왼손잡이인지 오른손잡이인지가 주어질 때 각 번호를 누를 손가락이 왼손인지 오른손인지를 나타내는 문자열을 리턴하는 문제
풀이 과정
왼쪽 3개와 오른쪽 3개의 숫자는 정해져있으므로 그대로 문자열을 추가해주고
가운데 열에 있는 4개의 숫자를 왼손으로 누를 지 오른손으로 누를 지를 정해주면 된다.
일단 숫자배열로 되어있기때문에 거리를 구하는 것은 현재 왼손이나 오른손의 위치에서 눌러야할 위치의 숫자를 빼주어 거리를 계산하면 된다.
단순히 숫자를 빼주면 수의 거리가 나오는 데 거기서 3으로 나누어서 몫과 나머지를 더해주게 되면 거리가 나온다.
몫은 행에 대한 거리이고 나머지는 열에 대한 거리이다.
예를 들어
다음 눌러야할 숫자 = 2, 왼손의 위치 = 7, 오른손의 위치 = 3일때
왼손 = (7-2 / 3) + (7-2 % 3) = 1+2 = 3
오른손 = (3-2 /3) + (3-2 %3) = 0+1 = 1
따라서 이럴 경우 오른손으로 누르게 된다.
풀이
import Foundation
func solution(_ numbers:[Int], _ hand:String) -> String {
var result = ""
var left: Int = 10
var right: Int = 12
var numberArr = numbers
for i in 0..<numberArr.count {
if numberArr[i] == 0 {
numberArr[i] = 11
}
switch numberArr[i] {
case 1,4,7:
left = numberArr[i]
result += "L"
case 3,6,9:
right = numberArr[i]
result += "R"
default:
//왼손거리와 오른손거리 구하기
var leftDistance = (abs(numberArr[i]-left) / 3) + (abs(numberArr[i]-left) % 3)
var rightDistance = (abs(numberArr[i]-right) / 3) + (abs(numberArr[i]-right) % 3)
if leftDistance > rightDistance {
right = numberArr[i]
result += "R"
} else if leftDistance < rightDistance {
left = numberArr[i]
result += "L"
} else {
//왼손과 오른손거리가 같을 경우
if hand == "right" {
right = numberArr[i]
result += "R"
} else {
left = numberArr[i]
result += "L"
}
}
}
}
return result
}
결과
print(solution([1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] , "right" ))
📂 정리
숫자에 대한 규칙을 빨리 캐치하고 거리를 구하는 것만 알아내면 빠르게 풀 수 있는 문제
제일 마지막 행인 * 0 #의 초기값을 설정해주는 것이 중요하다.
꼭 모든 예제를 실행하고 출력결과를 확인해야겠다.
728x90
반응형
'ALGORITHM > Swift' 카테고리의 다른 글
[알고리즘] Swift -프로그래머스 연습문제 #159994(카드 뭉치) (0) | 2023.05.19 |
---|---|
[알고리즘] Swift -프로그래머스 연습문제 #161989(덧칠하기) (0) | 2023.05.18 |
[알고리즘] Swift -프로그래머스 연습문제 #155652(둘만의 암호) (0) | 2023.04.05 |
[알고리즘] Swift -프로그래머스 연습문제 #160586(대충 만든 자판) (0) | 2023.04.05 |
[알고리즘] Swift -프로그래머스 연습문제 #161990(바탕화면 정리) (0) | 2023.04.05 |