문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/67256


제한 사항

입출력 예



풀이
import java.util.HashMap;
class Solution {
public String solution(int[] numbers, String hand) {
HashMap<Integer, Integer[]> numMap = new HashMap<>();
StringBuilder answer = new StringBuilder();
Integer[] left = new Integer[] { 0, 0 };
Integer[] right = new Integer[] { 2, 0 };
for (int i = 7; i >= 1; i -= 3) {
for (int j = i; j < i + 3; j++) {
numMap.put(j, new Integer[] { j - i, 3 - i / 3 });
}
}
numMap.put(0, new Integer[] { 1, 0 });
for (int number : numbers) {
switch(number) {
case 1:
case 4:
case 7:
left = numMap.get(number);
answer.append("L");
break;
case 3:
case 6:
case 9:
right = numMap.get(number);
answer.append("R");
break;
case 2:
case 5:
case 8:
case 0:
Integer[] middle = numMap.get(number);
Integer distanceL = middle[0] - left[0] + Math.abs(middle[1] - left[1]);
Integer distanceR = right[0] - middle[0] + Math.abs(middle[1] - right[1]);
if ((distanceL == distanceR && hand.equals("left")) || distanceL < distanceR) {
left = numMap.get(number);
answer.append("L");
}
else if ((distanceL == distanceR && hand.equals("right")) || distanceL > distanceR) {
right = numMap.get(number);
answer.append("R");
}
}
}
return answer.toString();
}
}
후기
처음에 접근을 잘못해서 시간이 조금 걸렸다. x, y를 생각하지 못하고 y축만 가지고 생각하다 보니까 코드도 복잡해지고 중앙 값일 때의 처리가 힘들었는데 나중에 다시 생각해보니 x축까지 설정하면 쉽게 풀릴 것 같았다. 왜 처음부터 이렇게 생각하지 않았을까... 어쨌든 그렇게 해서 풀긴했다. 다른 사람풀이도 대체로 구현 방식만 다르지 원리는 똑같았는데 다만 처음에 숫자 버튼 값 할당을 할 때 나는 for문을 돌려서 했는데 그냥 int[][]로 인덱스 값을 좌표로 설정하고 그 값을 숫자로 직접 할당하는 것도 나쁘지 않아 보였다.
'코딩테스트 (프로그래머스) > Java' 카테고리의 다른 글
| [프로그래머스][JAVA][Lv. 1] 실패율 (0) | 2023.07.16 |
|---|---|
| [프로그래머스][JAVA][Lv. 1] 3진법 뒤집기 (0) | 2023.07.15 |
| [프로그래머스][JAVA][Lv. 0] 옹알이 (1) (0) | 2023.07.12 |
| [프로그래머스][JAVA][Lv. 0] 주사위 게임 3 (0) | 2023.07.12 |
| [프로그래머스][JAVA][Lv. 1] 두 개 뽑아서 더하기 (0) | 2023.07.11 |