1. 문제 풀이 아이디어
- 손가락의 위치와 입력할 값 간의 거리를 계산하여 문제를 해결한다.
2. 나의 정답 코드
class Solution {
StringBuilder stringBuilder = new StringBuilder();
int n;
int l = 10;
int r = 12;
public String solution(int[] numbers, String hand) {
for (int i = 0; i < numbers.length; i++) {
n = numbers[i] == 0 ? 11 : numbers[i];
if (n == 1 || n == 4 || n == 7) {
addL();
} else if (n == 3 || n == 6 || n == 9) {
addR();
} else {
int ld = dist(l, n);
int rd = dist(r, n);
if (ld == rd) {
if (hand.charAt(0) == 'l') {
addL();
} else {
addR();
}
} else if (ld < rd) {
addL();
} else {
addR();
}
}
}
return stringBuilder.toString();
}
private void addL() {
stringBuilder.append('L');
l = n;
}
private void addR() {
stringBuilder.append('R');
r = n;
}
private int dist(int a, int b) {
int ax = (a - 1) % 3 + 1;
int ay = (a - 1) / 3;
int bx = (b - 1) % 3 + 1;
int by = (b - 1) / 3;
return Math.abs(ax - bx) + Math.abs(ay - by);
}
}
3. 정리
- 손가락의 위치를 정수로 저장하며,
,
0
,#
의 경우 각각 10, 11, 12로 설정하여 계산한다.
- 입력값이 1, 4, 7일 때와 3, 6, 9일 때는 결과값에 각각 'L'과 'R'을 바로 추가한다.
- 그 외의 경우
dist
메서드를 사용해 좌우 손가락의 거리를 계산한 후 값을 비교해 'L' 또는 'R'을 추가하여 문제를 해결한다.
4. 다른 사람의 코드 리뷰
class Solution {
// 0부터 9까지 좌표 {y,x}
int[][] numpadPos = {
{3,1}, //0
{0,0}, //1
{0,1}, //2
{0,2}, //3
{1,0}, //4
{1,1}, //5
{1,2}, //6
{2,0}, //7
{2,1}, //8
{2,2} //9
};
//초기 위치
int[] leftPos = {3,0};
int[] rightPos = {3,2};
String hand;
public String solution(int[] numbers, String hand) {
this.hand = (hand.equals("right")) ? "R" : "L";
String answer = "";
for (int num : numbers) {
String Umji = pushNumber(num);
answer += Umji;
if(Umji.equals("L")) {leftPos = numpadPos[num]; continue;}
if(Umji.equals("R")) {rightPos = numpadPos[num]; continue;}
}
return answer;
}
//num버튼을 누를 때 어디 손을 사용하는가
private String pushNumber(int num) {
if(num==1 || num==4 || num==7) return "L";
if(num==3 || num==6 || num==9) return "R";
// 2,5,8,0 일때 어디 손가락이 가까운가
if(getDist(leftPos, num) > getDist(rightPos, num)) return "R";
if(getDist(leftPos, num) < getDist(rightPos, num)) return "L";
//같으면 손잡이
return this.hand;
}
//해당 위치와 번호 위치의 거리
private int getDist(int[] pos, int num) {
return Math.abs(pos[0]-numpadPos[num][0]) + Math.abs(pos[1]-numpadPos[num][1]);
}
}
numpadPos
로 키패드 좌표를 명시해 가독성과 유지보수성이 뛰어나다.
- 좌표를 미리 정의해 연산 비용을 줄였으므로 성능도 더 효율적이다.
Share article