programmers.co.kr/learn/courses/30/lessons/67256
문제의 핵심은 아래와 같다. 이 문제는 가장 핵심 규칙인 좌표값에 최소거리를 어떻게 구할것인가?
각 좌표의 x값 y값의 절대값의 합이 거리를 나타내는 규칙을 알면 풀 수 있는 문제다. 마찬가지로 4x4 배열 5x5 배열의 경우에는 3으로 나누는 것이 아닌 4, 5로 나눠 해당 좌표를 구할 수 있다. 여기서 해당 키패드 숫자를 -1 해주는것도 잊으면 안된다. 앞으로 좌표를 활용한 알고리즘에서도 유용하게 쓰일 것 같다.
- 키패드는 순서대로 문제에 나와있는 사진과같이 1,2,3,4,5,6,7,8,9,*,0,# 순서로 있다.
- (1,4,7) 일때는 무조건 왼손을 사용하고, (3,6,9) 일때는 무조건 오른손을 사용하고, 현재 Left,Right의 위치를 갱신한다.
- 시작 위치는 왼손은 *(키패드 상으로 10번째) , 오른손은 #(키패드 상으로 12번째)
- 문제는 (2,5,8,0) 인데 여기서 규칙을 찾는것이 가장 중요하다.
->규칙 (키패드-1) / 3 은 X 좌표, (키패드-1) % 3 은 Y 좌표를 구할 수 있다.
5. 키패드 0은 11로 바꿔줘야한다. (0의 좌표는 (3,1))
6. 마지막으로, L또는 R이 위치한 좌표와 누르려는 키패드(n) 의 차이를 구한다
class Solution {
public static String solution(int[] numbers, String hand) {
StringBuffer sb = new StringBuffer();
int leftHand = 10;
int rightHand = 12;
for(int num : numbers) {
if(num == 1 || num == 4 || num == 7) {
sb.append("L");
leftHand = num;
}else if(num == 3 || num == 6 || num == 9) {
sb.append("R");
rightHand = num;
}else {
int distL = getDist( num, leftHand);
int distR = getDist( num, rightHand);
if( distL > distR) {
sb.append("R");
rightHand = num;
}else if(distL == distR){
if(hand =="right") {
sb.append("R");
rightHand = num;
}else {
sb.append("L");
leftHand = num;
}
}else if(distL < distR) {
sb.append("L");
leftHand = num;
}
}
}
return sb.toString();
}
/**
* @param num
* @param hand
* @return
*/
private static int getDist( int num, int hand ) {
if(num == 0) num = 11;
if(hand == 0) hand = 11;
int numx = (num-1) / 3;
int numy = (num-1) % 3;
int handx = (hand-1) / 3;
int handy = (hand-1) % 3;
int dist = Math.abs(numx - handx) + Math.abs(numy - handy);
return dist;
}
}
해당 답안을 IDE에서 실행하면 잘 동작하지만, 이상하게 프로그래머스 답안 제출 시 첫번째 케이스가 답이 올바르게 나오지 않는다..왤까??
'알고리즘' 카테고리의 다른 글
프로그래머스 - 피자 나눠 먹기 (1) (0) | 2023.02.08 |
---|---|
알고리즘 회고록 1) 직사각형 좌표 구하기(카카오) (0) | 2021.08.22 |
[백준] 14888번 / 연산자 끼워넣기 / java (1) | 2020.10.18 |
백준 17070번 : 파이프 옮기기 1 JAVA code (0) | 2020.01.28 |
삽입, 선택, 버블 정렬 (0) | 2017.06.15 |