반응형
안녕하세요. 개발 중인 정주입니다.
오늘은 프로그래머스 - 키패드 누르기 문제를 풀었습니다.
목차
Github
문제 링크
https://programmers.co.kr/learn/courses/30/lessons/67256
풀이
단순 구현 문제인데요. 괜히 뭔가 숨겨져 있지 않을까 고민을 많이 한 문제입니다.
알고 보니 숨겨진 건 없었고 있는 그대로 풀면 됐습니다.
문제 포인트
해당 문제에서 어려운 점은 중앙 부분을 누를 손을 구하는 것인데요.
왼손과 오른손의 위치를 저장해서 눌러야 하는 중앙 버튼과의 거리를 구해야 합니다.
왼손, 오른손의 현재 위치와 현재 키패드 좌표는 튜플을 이용해 저장했습니다.
func setupCursor(_ number: Int) -> (Int, Int) {
var cursor = (0,0)
switch number {
case 0: cursor = (1,0)
case 1: cursor = (0,3)
case 2: cursor = (1,3)
case 3: cursor = (2,3)
case 4: cursor = (0,2)
case 5: cursor = (1,2)
case 6: cursor = (2,2)
case 7: cursor = (0,1)
case 8: cursor = (1,1)
case 9: cursor = (2,1)
default: break
}
return cursor
}
두 튜플을 이용해 중앙 키패드 버튼과 왼손, 오른손 각각의 거리를 구했습니다.
let leftDistance = abs(leftCursor.0 - cursor.0) + abs(leftCursor.1 - cursor.1)
let rightDistance = abs(rightCursor.0 - cursor.0) + abs(rightCursor.1 - cursor.1)
이렇게 구한 거리를 이용해 중앙 부분을 누를 손을 구하면 됩니다.
전체 코드
import Foundation
func solution(_ numbers:[Int], _ hand:String) -> String {
func setupCursor(_ number: Int) -> (Int, Int) {
var cursor = (0,0)
switch number {
case 0: cursor = (1,0)
case 1: cursor = (0,3)
case 2: cursor = (1,3)
case 3: cursor = (2,3)
case 4: cursor = (0,2)
case 5: cursor = (1,2)
case 6: cursor = (2,2)
case 7: cursor = (0,1)
case 8: cursor = (1,1)
case 9: cursor = (2,1)
default: break
}
return cursor
}
func addString(number: Int, leftDistance: Int, rightDistance: Int) -> String {
var string = ""
switch number {
case 1, 4, 7:
string = "L"
case 3, 6, 9:
string = "R"
case 0, 2, 5, 8:
if leftDistance < rightDistance {
string = "L"
} else if leftDistance > rightDistance {
string = "R"
} else {
if hand == "right" {
string = "R"
} else {
string = "L"
}
}
default:
break
}
return string
}
var result: String = ""
var leftCursor: (Int, Int) = (0,0)
var rightCursor: (Int, Int) = (2,0)
for number in numbers {
let cursor: (Int, Int) = setupCursor(number)
let leftDistance = abs(leftCursor.0 - cursor.0) + abs(leftCursor.1 - cursor.1)
let rightDistance = abs(rightCursor.0 - cursor.0) + abs(rightCursor.1 - cursor.1)
let string: String = addString(number: number, leftDistance: leftDistance, rightDistance: rightDistance)
result += string
if string == "R" {
rightCursor = cursor
} else {
leftCursor = cursor
}
}
return result
}
let numbers: [Int] = [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2]
let hand: String = "left"
print(solution(numbers, hand))
아직은 초보 개발자입니다.
더 효율적인 코드 훈수 환영합니다!
공감과 댓글 부탁드립니다.
반응형