728x90
반응형
programmers.co.kr/learn/courses/30/lessons/67256?language=swift
키패드를 왼손/오른손으로 누를지 경우에 따라 분류해주면 되는 문제.
키패드를 좌표로 보고 현재 왼손, 오른손 위치와 누르고자 하는 버튼의 좌표 거리를 비교하여 누를 수 있도록 했다.
그리 어려운 문제는 아니기에 바로 코드로 가보자!
import Foundation
func solution(_ numbers:[Int], _ hand:String) -> String {
// numbers를 queue처럼 쓰고자 변수 선언
var numbers = numbers
// 키패드 값 입력
let N = [["1","4","7","*"],["2","5","8","0"], ["3","6","9","#"]]
// 키패드 값 : 좌표값을 담을 딕셔너리 객체 생성
var Ndict = [String:[Int]]()
// 각 값에 좌표값 설정
for (i,n) in N.enumerated() {
for (j,v) in n.enumerated() {
Ndict[v] = [i,j]
}
}
var answer = ""
// 현 위치 설정
var leftHand = "*"
var rightHand = "#"
// 하나씩 빼면서 빈 값일 때 까지
while !numbers.isEmpty {
// 값과 좌표를 뽑고
var value = String(numbers.removeFirst())
var value_loc = Ndict[value]!
// 1번째줄일 경우 거리 상관없이 무조건 "왼손"으로
if N[0].contains(value) {
answer.append("L")
leftHand = value
// 3번째줄일 경우 거리 상관없이 무조건 "왼손"으로
} else if N[2].contains(value) {
answer.append("R")
rightHand = value
// 2번째줄일 경우에만 거리로 판단 (다만 거리가 같을 경우 손잡이에 따라 판단)
} else {
var l_v = abs(Ndict[leftHand]![0] - value_loc[0]) + abs(Ndict[leftHand]![1] - value_loc[1])
var r_v = abs(Ndict[rightHand]![0] - value_loc[0]) + abs(Ndict[rightHand]![1] - value_loc[1])
// 거리 비교 (작은 값의 손을 선택)
if l_v < r_v {
leftHand = value
answer.append("L")
} else if l_v > r_v {
rightHand = value
answer.append("R")
} else {
// 거리가 같을 경우 손잡이에 따라 결정
if hand == "right" {
answer.append("R")
rightHand = value
} else {
answer.append("L")
leftHand = value
}
}
}
}
return answer
}
[ 프로세스 ]
(*모든 경우 누르면 해당 손의 좌표를 누른 번호의 좌표로 변경)
1. (키패드 값 : 좌표)로 구성된 딕셔너리 객체 생성
2. 왼손, 오른손의 현 위치 설정
3. 룰에 따라 1열,3열은 왼손,오른손으로 누르도록
4. 2열의 경우 거리에 따라 선택하도록
4-1. 거리가 같을 경우 손잡이에 따라 선택하도록
5. 결과값 리턴
각각의 케이스들만 잘 따져서 규칙에 맞게 구현한다면 쉽게 해결될 수 있는 문제.
728x90
반응형