[Swift] [프로그래머스 1단계] 키패드 누르기자료구조와 알고리즘/알고리즘2022. 8. 6. 21:39
Table of Contents
import Foundation
func solution(_ numbers:[Int], _ hand:String) -> String {
var ret:String = ""
// 키패드를 2차원 배열로 생각하고, 숫자 0의 좌표
var datas:[[Int]] = [[3, 1]]
// 키패드 *
var leftHand: [Int] = [3, 0]
// 키패드 #
var rightHand: [Int] = [3, 2]
// 키패드 숫자별로 좌표
for i in 1...9 {
datas.append([(i - 1) / 3, (i - 1) % 3])
}
// 거리 계산
func distance(_ N: inout [Int], _ L: inout [Int], _ R: inout [Int]) -> String {
let leftD:Int = abs(N[0] - L[0]) + abs(N[1] - L[1])
let rightD:Int = abs(N[0] - R[0]) + abs(N[1] - R[1])
if leftD == rightD && hand == "right" {
R = N
return "R"
} else if leftD == rightD && hand == "left" {
L = N
return "L"
} else if leftD > rightD {
R = N
return "R"
}
L = N
return "L"
}
// 문제에서 주어진 번호 하나하나 확인
for number in numbers {
if number % 3 == 1 {
leftHand = datas[number]
ret += "L"
} else if number != 0 && number % 3 == 0 {
rightHand = datas[number]
ret += "R"
} else {
ret += distance(&datas[number], &leftHand, &rightHand)
}
}
return ret
}
0 | 1 | 2 | |
0 | 1 | 2 | 3 |
1 | 4 | 5 | 6 |
2 | 7 | 8 | 9 |
3 | * | 0 | # |
키패드의 숫자 0은 좌표 [3, 1]을 가지고 있습니다.
숫자 6은 [1, 2]의 좌표를 가지고 있다고 생각을 했습니다.
이러한 데이터를 [[Int]]의 형태로 만들어 줍니다.
왼손은 *, 오른손은 #에서 시작을 합니다.
이제 문제에서 주어진 배열의 숫자들이 변하면서 왼손 혹은 오른손이 움직이는 건지 확인을 할텐데,
주어진 숫자와 왼손, 오른손의 거리를 각각 비교를 합니다.
왼손이 더 가깝다면 왼손은 위치를 변경하고, 오른손이 더 가깝다면 오른손의 위치를 변경합니다.
그리고 반환값에 움직인 손을 넣어줍니다.
그리고 1, 4, 7 이라면 왼손이 움직이고 3, 6, 9일 때는 오른손이 움직입니다
위에서 비교를 할 때에는 거리가 같다면 왼손잡이라면 왼손이 움직이며, 오른손이라면 오른손이 움직이면 됩니다
'자료구조와 알고리즘 > 알고리즘' 카테고리의 다른 글
[Swift] [leetcode] Implement strStr ... etc (0) | 2022.08.09 |
---|---|
[Swift] [leetcode] Palindrome Number ... etc (0) | 2022.08.07 |
[Swift] [프로그래머스 1단계] 체육복 (0) | 2022.08.04 |
9461 백준 문제풀이 (C언어) (0) | 2021.04.29 |
1904 백준 문제풀이 (feat. 동적계획법) (0) | 2021.04.28 |
@jaewpark :: 코스모스, 봄보다는 늦을지언정 가을에 피어나다
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!