Programming/Algorithm & Data Structure
[Swift] 프로그래머스 2020 카카오 인턴십 > 키패드 누르기
guswlsdk
2022. 7. 7. 09:50
반응형
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제풀이
1. 키패드에서는 10(0~9)개의 숫자만 표현하기 때문에 딕셔너리로 숫자마다 좌표를 정의했다.
2. numbers의 각 요소가 1, 4, 7에 해당하는 경우는 왼손이며, 왼손의 현재 위치를 수정하고, 3, 6, 9에 해당하는 경우 오른손이며, 오른손의 현재 위치를 수정한다.
3. numbers의 각 요소가 2, 5, 8 ,0에 해당하는 경우 왼손의 위치와 오른손의 위치를 숫자와의 위치와 비교하여 거리를 구한다. 이 때 거리는 |(x1 - x2)| + |(y1 - y2)|이다.
4. 만약 왼손으로부터의 거리와 오른손으로부터의 거리가 같을 경우 처음에 주어진 hand 매개변수에 따른다.
코드
func solution(_ numbers:[Int], _ hand:String) -> String {
var curL = (1,4)
var curR = (3,4)
let left = [1,4,7]
let right = [3,6,9]
let numDict = [1:(1,1), 2: (2,1), 3: (3,1), 4: (1,2), 5:(2,2), 6:(3,2), 7:(1,3), 8:(2,3), 9: (3,3), 0:(2,4)]
var result = ""
for i in numbers{
if left.contains(i){
curL = numDict[i]!
result += "L"
}else if right.contains(i){
curR = numDict[i]!
result += "R"
}else{
let returnHand = disMin(curL: curL, curR: curR, cur: numDict[i]!)
if returnHand == "L"{
curL = numDict[i]!
result += "L"
}else if returnHand == "R"{
curR = numDict[i]!
result += "R"
}else{
if hand == "left"{
curL = numDict[i]!
result += "L"
}else{
curR = numDict[i]!
result += "R"
}
}
}
}
return result
}
func disMin(curL: (Int, Int), curR: (Int, Int), cur: (Int, Int)) -> String{
let disL = abs(cur.0 - curL.0) + abs(cur.1 - curL.1)
let disR = abs(cur.0 - curR.0) + abs(cur.1 - curR.1)
if disL > disR{
return "R"
}else if disL < disR{
return "L"
}else{
return "="
}
}
반응형