이 문제를 마지막으로 프로그래머스 1단계 문제를 다 풀었다.
2단계는 1/3 정도 남았으니 2단계도 다 풀 수 있도록 계속해야겠다.
1단계 중에서 가장 어려웠던 문제로 느꼈다...
2580 처리를 어떻게 해야 할지 고민을 많이 했다.
키패드 모든 숫자를 xy좌표로 쓸 수 있게 keypad 변수를 만들었고
x와 y의 거리를 계산해서 리턴할 수 있게 했다.
문제 자체는 그렇게 어렵다고 느끼진 않았는데 생각을 코드로 구현하는 게 힘들었다.
최종 코드
class Solution {
public String solution(int[] numbers, String hand) {
String answer = "";
// * 0 # 바꾸기
int left = 10;
int mid = 11;
int right = 12;
for (int i = 0; i < numbers.length; i++) {
// 1 4 7 이면
if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7) {
answer += "L";
left = numbers[i];
}
// 3 6 9 이면
else if (numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9) {
answer += "R";
right = numbers[i];
}
// 2 5 8 0 이면
else {
//numbers[i] 가 0이면 mid로 바꾸기
if(numbers[i] == 0) {
numbers[i] = mid;
}
int lp = xy(numbers[i], left);
int rp = xy(numbers[i], right);
// 왼쪽손보다 오른쪽손이 더 가까운 경우
if(lp > rp) {
answer += "R";
right = numbers[i];
}
// 오른쪽손보다 왼쪽손이 더 가까운 경우
else if(lp < rp) {
answer += "L";
left = numbers[i];
}
// 왼쪽손과 오른쪽손 거리가 같은 경우
else {
if(hand.equals("left")) {
answer += "L";
left = numbers[i];
}
else {
answer += "R";
right = numbers[i];
}
}
}
}
return answer;
}
public static int xy(int n, int p) {
// 키패드를 좌표로 변수 설정
int[][] keypad = {{0,0},{0,1},{0,2},{1,0},{1,1},{1,2},{2,0},{2,1},{2,2},{3,0},{3,1},{3,2}};
// x 좌표 거리 계산
int xx = Math.abs(keypad[p - 1][0] - keypad[n - 1][0]);
// y 좌표 거리 계산
int yy = Math.abs(keypad[p - 1][1] - keypad[n - 1][1]);
return xx + yy;
}
}
'코딩 테스트' 카테고리의 다른 글
(Java) 프로그래머스 최댓값과 최솟값 (Lv 2) (0) | 2021.12.15 |
---|---|
(Java) 프로그래머스 최솟값 만들기 (0) | 2021.12.04 |
(Java) 프로그래머스 크레인 인형뽑기 게임 (0) | 2021.12.01 |
(Java) 프로그래머스 숫자 문자열과 영단어 (0) | 2021.11.27 |
(Java) 프로그래머스 폰켓몬 (0) | 2021.11.24 |