문제
해결 방법
키패드의 위치가 위와 같을 때, 각 숫자에 아래와 같이 좌표를 설정해주었다.
이때 0은 계산의 편리성을 위해 11로 바꾸어주었다.
즉, 각 칸의 x 좌표는 키패드 숫자를 3으로 나눈 몫이고(오른쪽 열은 예외적으로 3으로 나눈 몫 - 1)
y 좌표는 왼쪽 열을 0, 가운데 열을 1, 오른쪽 열을 2로 설정하였다.
for문을 돌면서 입력에 맞게 왼쪽 엄지, 또는 오른쪽 엄지를 이동하면 되는데
나는 자꾸 13~20번 테스트 케이스에서 실패했다고 떴다.
그 이유는,,,
가운데 열의 키패드를 누르는 경우 왼쪽 엄지, 오른쪽 검지와의 거리를 비교해야 하고
대각선으로의 이동은 불가능한데
나는 계속 좌표 구하듯이 두 점 사이의 거리를 구하고 있었던 것이다....ㅎ
예를 들어,
왼쪽, 오른쪽 엄지의 위치가 위와 같고 오른손잡이에 2를 눌러야 하는 상황이라면,
점과 점 사이의 거리로 봤을 때는 왼쪽이 루트 2, 오른쪽이 2만큼 움직여야 하므로 왼쪽 엄지를 움직여야 한다.
하지만 대각선 이동이 불가능하므로 왼쪽, 오른쪽 엄지 모두 2만큼 이동해야 하고
그럼 거리가 동일해지고 오른손잡이이기 떄문에 오른쪽 엄지를 움직여야 한다.
이러한 테스트 케이스에서 계속 걸려서 틀렸다고 떴던 것이다 ㅎㅎ
두 점 사이의 거리를 구하는걸로 구현했던 부분만 절댓값 계산으로 바꿔줬더니 통과!
내 코드(C++)
// 2020 카카오 인턴십
// 키패드 누르기
#include <string>
#include <vector>
using namespace std;
string solution(vector<int> numbers, string hand) {
string answer = "";
int leftX = 3, leftY = 0, rightX = 3, rightY = 2, leftD, rightD;
for(int i = 0 ; i < numbers.size() ; i++) {
if(numbers[i] == 0) numbers[i] = 11;
if(numbers[i] % 3 == 1) { // 왼쪽 열
answer.push_back('L');
leftX = numbers[i]/3; leftY = 0;
}
else if(numbers[i] % 3 == 0) { // 오른쪽 열
answer.push_back('R');
rightX = numbers[i]/3-1; rightY = 2;
}
else { // 가운데 열
leftD = abs(leftX-numbers[i]/3) + abs(leftY-1);
rightD = abs(rightX-numbers[i]/3) + abs(rightY-1);
// 왼쪽 엄지가 더 가까운 경우
if(leftD < rightD) {
leftX = numbers[i]/3; leftY = 1;
answer.push_back('L');
}
// 오른쪽 엄지가 더 가까운 경우
else if(leftD > rightD){
rightX = numbers[i]/3; rightY = 1;
answer.push_back('R');
}
// 왼쪽, 오른쪽 엄지와의 거리 같은 경우
else {
if(hand.compare("left") == 0) { // 왼손잡이
leftX = numbers[i]/3; leftY = 1;
answer.push_back('L');
}
else { // 오른손잡이
rightX = numbers[i]/3; rightY = 1;
answer.push_back('R');
}
}
}
}
return answer;
}
반응형
'프로그래머스 > 구현' 카테고리의 다른 글
[12980] 점프와 순간 이동(C++) (0) | 2022.10.28 |
---|---|
[프로그래머스] 기능개발 (0) | 2022.06.29 |
2021 KAKAO BLIND RECRUITMENT 신규 아이디 추천 (0) | 2021.09.10 |