문제
해결 방법
(1) 키패드간 거리가 '직선'이 아니라 상하좌우로 제한됨 -> X,Y 좌표계 도입!
(2) [1,4,7]-> L, [3,6,9] -> R 고정이고 [2,5,8,0] 만 거리 계산이 필요함. // 거리가 같다면 hand 값 따지기
(3) 입력값은 모두 '숫자'지만 초기 왼,오른손은 '*', '#' character -> 어차피 정수로 변환하면 되겠다. -> 모든 입력값을 정수값으로 처리해도 무관함.
(4) 이전 입력 값을 keep 할 필요가 있음.
소스코드 (Kotlin)
import kotlin.math.abs
data class Point(val x:Int, val y:Int) {
}
class KeypadPress2 {
fun solution(numbers: IntArray, hand: String): String {
var answer : String = ""
// 1. 147-> L vs 369-> R 고정
// 2. 이전 버튼 엄지손 위치 keep 필요.
// 3. 2580 -> 키패드에서 더 가까운 손. 같다면 hand
// * 번호간의 거리를 어떻게 계산할까? 2580과 147*, 369#에 대한 모든 좌표거리 쌍을 갖고 있는 것은
// 하드코딩이 길어지므로 비효율적. (상당히 많은사람이 이렇게 푼듯)
// 직선거리가 아닌 상하좌우만 가능 -> X,Y 좌표계 도입 (x좌표 거리차 절대값 + Y좌표 거리차 절대값 == 총거리)
// *을 (0,0) 기준으로 시작하면 됨.
// Pair Tripple은 보통 x,y,z가 다른 데이터 타입 일 때 사용
val keyMap = mapOf<Int, Point>(
'*'.toInt() to Point(0,0), 0 to Point(1,0), '#'.toInt() to Point(2,0),
7 to Point(0,1), 8 to Point(1,1), 9 to Point(2, 1),
4 to Point(0,2), 5 to Point(1,2), 6 to Point(2, 2),
1 to Point(0,3), 2 to Point(1,3), 3 to Point(2,3)
)
var preLeftNumber : Int = '*'.toInt()
var preRightNumber : Int= '#'.toInt()
for (num in numbers) {
when (num) {
// 147 369는 고정
1,4,7 -> {
answer += "L"
}
3,6,9 -> {
answer += "R"
}
else -> {
// 이전 엄지손가락 위치 반영 좌표계 거리계산
val leftDistance : Int =
abs(keyMap[num]!!.x - keyMap[preLeftNumber]!!.x) +
abs(keyMap[num]!!.y - keyMap[preLeftNumber]!!.y)
val rightDistance : Int =
abs(keyMap[num]!!.x - keyMap[preRightNumber]!!.x) +
abs(keyMap[num]!!.y - keyMap[preRightNumber]!!.y)
if (leftDistance < rightDistance) answer += "L"
else if (leftDistance > rightDistance) answer += "R"
else {
// 거리가 같은 경우 왼/오른손잡이로 구분
when (hand) {
"left" -> answer += "L"
else -> answer += "R"
}
}
}
}
// 방금 누른 (왼/오른) 손가락에 누른 번호 저장.
if (answer.last() == 'L') preLeftNumber = num
else preRightNumber = num
}
return answer
}
}
'Algorithm > Algorithm (문제풀이)' 카테고리의 다른 글
[백준 2267] 단지번호 붙이기 (0) | 2020.10.22 |
---|---|
[백준 11724] 연결 요소의 개수 (0) | 2020.10.21 |
[Programmers] 체육복 (0) | 2020.10.14 |
[백준 1712] 손익분기점 (0) | 2019.12.15 |
피보나치 수열 3 (feat. 백준 1003 피보나치 함수) (0) | 2019.12.09 |