알고리즘을 푸는 언어를 c++ 에서 swift 언어로 갈아타려고 풀어본 첫 번째 문제.
난이도가 1이었지만 구현을 못함.... 카카오 코테 짜증남 ㅋㅋ
아무튼 원리는 이렇다.
키패드가
1 2 3
4 5 6
7 8 9
* 0 #
이렇게 돼 있는데 이것을 배열의 인덱스로 바꾸는 것.
예를 들어 숫자 0이 들어왔다면 배열의 [0]번이 되게끔 만들면 됨.
그러면 abs(현재 위치.x 좌표 - 타겟 위치.x 좌표) + abs(현재 위치.y좌표 - 타겟 위치.y 좌표)
는 곧 거리가 됨.
여기까지만 알았다면 이제 구현만 남음.
1, 3, 7 번이랑 3, 6, 9번은 어차피 L, R로 정해져 있으니 위치만 저장해주고,
나머지 2,5,8,0번에 대해 거리를 비교하여 L인지 R인지를 결정해주고,
거리가 같다면 hand에 따라 L, R을 결정해주면 됨.
L과 R 둘 다 결정과 동시에 손가락 위치를 저장해줘야 함.
아래는 정답 코드:
import Foundation
func isRight(_ number: Int) -> Bool {
return (number == 3 || number == 6 || number == 9)
}
func isLeft(_ number: Int) -> Bool {
return (number == 1 || number == 4 || number == 7)
}
func solution(_ numbers:[Int], _ hand:String) -> String {
var L = (3, 0)
var R = (3, 2)
var answer: String = ""
let pos: [(Int, Int)] = [(3, 1), // 0
(0, 0), (0, 1), (0, 2), // 1, 2, 3
(1, 0), (1, 1), (1, 2), // 4, 5, 6
(2, 0), (2, 1), (2, 2), // 7, 8, 9
(3, 0), (3, 2)] // *, #
numbers.forEach { number in
let target = pos[number]
if (isLeft(number)) {
L = target
answer += "L"
} else if (isRight(number)) {
R = target
answer += "R"
} else {
let leftDistance = abs(target.0 - L.0) + abs(target.1 - L.1)
let rightDistance = abs(target.0 - R.0) + abs(target.1 - R.1)
if (leftDistance < rightDistance) {
L = target
answer += "L"
} else if (rightDistance < leftDistance) {
R = target
answer += "R"
} else {
if hand == "right" {
answer += "R"
R = target
} else {
answer += "L"
L = target
}
}
}
}
return answer
}
'Algorithm' 카테고리의 다른 글
프로그래머스 - 실패율 [Swift] (1) | 2021.06.27 |
---|---|
프로그래머스 신규 아이디 추천 [swift] (0) | 2021.06.26 |
프로그래머스 구명보트 [C++] (0) | 2021.06.17 |
프로그래머스 - 124 나라의 숫자 [C++] (0) | 2021.06.10 |
프로그래머스 - 예상 대진표 [C++] (0) | 2021.06.06 |
최근댓글