반응형
https://school.programmers.co.kr/learn/courses/30/lessons/67256
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
내 풀이
class Solution {
public String solution(int[] numbers, String hand) {
String answer = "";
int[] currentL = {3,0}, currentR = {3,2};
int[][] keypad = {
{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
};
for(int i=0; i<numbers.length; i++){
int num = numbers[i];
int x = keypad[num][0];
int y = keypad[num][1];
if(keypad[num][1]==0){
answer += 'L';
currentL[0] = x;
currentL[1] = y;
} else if(keypad[num][1]==2){
answer += 'R';
currentR[0] = x;
currentR[1] = y;
} else {
int disL = Math.abs(currentL[0]-x)+Math.abs(currentL[1]-y);
int disR = Math.abs(currentR[0]-x)+Math.abs(currentR[1]-y);
if(disL < disR){
answer += 'L';
currentL[0] = x;
currentL[1] = y;
} else if(disL > disR){
answer += 'R';
currentR[0] = x;
currentR[1] = y;
} else if(disL == disR && hand.equals("left")){
answer += 'L';
currentL[0] = x;
currentL[1] = y;
} else if(disL == disR && hand.equals("right")){
answer += 'R';
currentR[0] = x;
currentR[1] = y;
}
}
}
return answer;
}
}
제미나이가 리팩토링한 풀이
class Solution {
public String solution(int[] numbers, String hand) {
// 문자열을 효율적으로 이어 붙이기 위한 StringBuilder 사용
StringBuilder answer = new StringBuilder();
// 1차원 배열로 현재 왼손, 오른손 좌표 관리
int[] leftPos = {3, 0};
int[] rightPos = {3, 2};
// 키패드 좌표 배열
int[][] keypad = {
{3, 1}, {0, 0}, {0, 1}, {0, 2}, {1, 0},
{1, 1}, {1, 2}, {2, 0}, {2, 1}, {2, 2}
};
for (int num : numbers) {
int x = keypad[num][0];
int y = keypad[num][1];
if (y == 0) {
answer.append("L");
leftPos[0] = x; leftPos[1] = y;
} else if (y == 2) {
answer.append("R");
rightPos[0] = x; rightPos[1] = y;
} else {
// 가운데 라인은 거리를 먼저 계산
int disL = Math.abs(leftPos[0] - x) + Math.abs(leftPos[1] - y);
int disR = Math.abs(rightPos[0] - x) + Math.abs(rightPos[1] - y);
// 어느 손을 움직일지 '결정'만 먼저 내리기
boolean moveLeft = false;
if (disL < disR) {
moveLeft = true;
} else if (disL > disR) {
moveLeft = false;
} else {
// 거리가 같을 때는 주 주손잡이 기준
moveLeft = hand.equals("left");
}
// 결정된 손에 따라 최종적으로 1번만 값 갱신 (중복 코드 제거)
if (moveLeft) {
answer.append("L");
leftPos[0] = x; leftPos[1] = y;
} else {
answer.append("R");
rightPos[0] = x; rightPos[1] = y;
}
}
}
return answer.toString();
}
}반응형
'코딩테스트' 카테고리의 다른 글
| [프로그래머스/Java] 개인정보 수집 유효기간 (split 개념) (0) | 2026.07.09 |
|---|---|
| [프로그래머스/Java] 크레인 인형뽑기 게임 (Stack 개념+이중배열) (0) | 2026.07.08 |
| [프로그래머스/Java] 최소 직사각형 (0) | 2026.07.08 |
| [프로그래머스/Java] 모의고사 (ArrayList 개념) (0) | 2026.07.08 |
| [프로그래머스/Java] 문자열 뒤집기 (StringBuilder) (0) | 2026.07.07 |