티스토리 뷰
https://programmers.co.kr/learn/courses/30/lessons/67256
내 풀이
머리를 굴려봤지만 포기..
로.직.폭.망
로직보기
func solution(_ numbers:[Int], _ hand:String) -> String {
var lhs = -1
var rhs = -2
var lhsDistance = 0
var rhsDistance = 0
var leftNumbers = [1, 4, 7]
var rightNumbers = [3, 6, 9]
var pressHand: [String] = []
for num in numbers {
switch lhs == {
case num == 0:
lhsDistance = 1
case num == 8:
lhsDistance = 2
case num == 5:
lhsDistance = 3
case num == 2:
lhsDistance = 4
}
switch rhs == "#" {
case num == 0:
rhsDistance = 1
case num == 8:
rhsDistance = 2
case num == 5:
rhsDistance = 3
case num == 2:
rhsDistance = 4
}
if lhs + 1 == num {
lhsDistance = 1
} else if lhs + 4 == num {
lhsDistance = 2
} else if lhs + 7 == num {
lhsDistance = 3
} else if lhs + 9 == num {
lhsDistance = 4
} else if lhs - 2 == num {
lhsDistance = 2
} else if lhs + 6 == num {
lhsDistance = 3
} else if lhs - 5 == num {
lhsDistance = 3
} else if lhs - 7 == num {
lhsDistance = 2
}
if rhs - 1 == num {
rhsDistance = 1
} else if rhs + 2 == num {
rhsDistance = 2
} else if rhs + 5 == num {
rhsDistance = 3
} else if rhs + 7 == num {
rhsDistance = 4
} else if rhs - 4 == num {
rhsDistance = 2
} else if rhs == 6 && num == 0 {
rhsDistance = 3
} else if rhs - 7 == num {
rhsDistance = 3
} else if rhs == 9 && num == 0 {
rhsDistance == 1
}
if lhsDistance > rhsDistance {
pressHand.append("L")
lhs = num
} else if rhsDistance > lhsDistance {
pressHand.append("R")
rhs = num
} else if lhsDistance == rhsDistance && hand == "left" {
pressHand.append("L")
lhs = num
} else {
pressHand.append("R")
rhs = num
}
if leftNumbers.contains(num) {
pressHand.append("L")
} else if rightNumbers.contains(num) {
pressHand.append("R")
}
}
print(pressHand)
return ""
}
solution([1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5], "right")
다른사람의 풀이
import Foundation
func solution(_ numbers:[Int], _ hand:String) -> String {
enum KeypadHand {
case left
case right
}
var result = ""
var leftHand = 10
var rightHand = 12
for i in numbers {
let number = i == 0 ? 11 : i
var tapHand: KeypadHand = .left
switch number {
case 1, 4, 7:
tapHand = .left
case 3, 6, 9:
tapHand = .right
case 2, 5 ,8, 11:
let leftTemp = abs(number - leftHand)
let rightTemp = abs(number - rightHand)
let leftDistance = (leftTemp / 3) + (leftTemp % 3)
let rightDistance = (rightTemp / 3) + (rightTemp % 3)
if leftDistance == rightDistance {
tapHand = hand == "left" ? .left : .right
} else {
tapHand = leftDistance < rightDistance ? .left : .right
}
default:
break
}
if tapHand == .left {
result.append("L")
leftHand = number
} else {
result.append("R")
rightHand = number
}
}
return result
}
이번엔 메소드를 배운것 보다 로직을 배운게 좋았다.
문제 풀이를 정리해 보자면
사용자가 키패드를 누를때 왼손으로는 1, 4 ,7을 오른손으로는 3, 6, 9를 무조건 누르게 되고,
가운데 있는 2, 5, 8, 0은 손의 거리가 가장 가까운 손으로 눌러야 하며,
둘다 거리가 같다면 왼손잡이인지 오른손잡이인지를 보고 해당손잡이의 손으로 누르는 방식을 구현을 해야한다.
해당거리를 구하는게 어려웠는데 위의 풀이는 이렇다.
키패드의 숫자들을 살펴보면
좌우에 있는 숫자들끼리는 +1, -1씩 차이가 난다. 예) 4, 5, 6
상하에 있는 숫자들끼리는 +3, -3씩 차이가 난다. 예) 1, 4, 7
현재 손이 있는 곳과 다음 눌러야 하는 숫자의 차이를 3으로 나누어 그 몫과 나머지를 더하면 해당 거리를 구할 수 있다.
예를 들어 살펴보자
왼손 위치 | 오른손 위치 | 눌러야 할 숫자 |
1 | 9 | 8 |
왼손 위치(1) - 눌러야 할 숫자(8) = 7 (차이를 구하는 것이므로 절대값으로 계산한다)
왼손 위치와 눌러야 할 숫자의 차이(7) / 3 = 2...1
몫이 2이고 나머지가 1이므로 두 숫자를 더한 3이 키패드 1과 8의 거리값이 된다
오른손 위치(9) - 눌러야 할 숫자(8) = 1
1/ 3 = 0...1
몫이 0이고 나머지가 1이므로 두 숫자를 더한 1이 키패드 9와 8의 거리값이 된다
이런식으로 계산할 경우
키패드 숫자 중 *, 0, # 은 아래처럼 숫자로 변환후 계산해야 한다.
* = 10
0 = 11
# = 12
배운것
abs(_:)
절대값을 구해줍니다.
예제
var num = -10
print(num)
num = abs(num)
print(num)
// -10
// 10
'알고리즘' 카테고리의 다른 글
[Swift 알고리즘] - Squares of a Sorted Array (Leetcode) (0) | 2022.05.20 |
---|---|
[Swift 알고리즘] - Find Numbers with Even Number of Digits(Leetcode) (0) | 2022.05.19 |
[Swift 알고리즘] - 이상한 문자 만들기(Programmers) (0) | 2022.05.16 |
[Swift 알고리즘] - 콜라츠 추측 (Programmers) (0) | 2022.05.13 |
[Swift 알고리즘] - 시저암호 (programmers) (0) | 2022.05.12 |
- Total
- Today
- Yesterday
- swift reduce
- Swift init
- Swift ModernRIBs
- Swift Error Handling
- swift property
- 2023년 회고
- RIBs tutorial
- Swift inout
- iOS error
- Swift 프로퍼티
- Swift joined
- swift (programmers)
- Swift joined()
- Swift final
- Class
- Combine: Asynchronous Programming with Swift
- Swift 프로그래머스
- removeLast()
- swift programmers
- Swift 내림차순
- swift 고차함수
- RTCCameraVideoCapturer
- Swift Leetcode
- Swift 알고리즘
- swift protocol
- Swift RIBs
- ios
- 원티드 프리온보딩
- Swift
- CS 네트워크
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |