문제 설명
입출력 예시
요약
1,4,7은 왼손 3,6,9는 오른손 나머지는 가까운 손이 누른다.
풀이
문제 해석
좌표로 생각하고 오른쪽 왼쪽 이동한 칸 수 계산하기
접근 방식
1. 각 번호를 row와 col 형식의 좌표로 구성
→ 1번: (0, 0), 2번: (0, 1), ... , 0번: (3, 1)
2. 왼손 오른손의 시작위치 설정
→ 왼손: (3, 0), 오른손(3, 2)
3. 1,4,7은 왼손 3,6,9는 오른손 나머진 가까운 손
→ 누를 번호와 각 손의 위치를 계산해서 가까운 위치를 해당 번호 좌표로 변경
코드리뷰
import java.util.*;
class Solution {
class HandPosition { // 손의 위치를 담을 객체 클래스 정의
int row;
int col;
public HandPosition(int row, int col) {
this.row = row;
this.col = col;
}
}
public String solution(int[] numbers, String hand) {
String answer = "";
HashMap<Integer, String> keypad = new HashMap<>();
HandPosition left = new HandPosition(3, 0); // 왼손 초기화
HandPosition right = new HandPosition(3, 2); // 오른손 초기화
for(int i = 0; i < 10; i++) {
if(i == 0) {
keypad.put(i, "3 1"); // 0번의 경우 직접 세팅
} else {
String num1 = String.valueOf((i-1) / 3); // 각 번호의 row 좌표
String num2 = String.valueOf((i-1) % 3); // 각 번호의 col 좌표
keypad.put(i, (num1 + " " + num2)); // ex) 1번의 경우 "0 0"과 같이 담김
}
}
for(int i : numbers) {
int keyRow = Integer.valueOf(keypad.get(i).split(" ")[0]);
int keyCol = Integer.valueOf(keypad.get(i).split(" ")[1]);
int distL = Math.abs(left.row - keyRow) + Math.abs(left.col - keyCol); // 왼손과 거리계산
int distR = Math.abs(right.row - keyRow) + Math.abs(right.col - keyCol); // 오른손과 거리계산
if(i == 1 || i == 4 || i == 7) { // 147번은 왼손
answer += "L";
left.row = keyRow;
left.col = keyCol;
} else if(i == 3 || i == 6 || i == 9) { // 369번은 오른손
answer += "R";
right.row = keyRow;
right.col = keyCol;
} else { // 나머지는 거리계산
if(distL > distR) {
answer += "R";
right.row = keyRow;
right.col = keyCol;
} else if(distL < distR) {
answer += "L";
left.row = keyRow;
left.col = keyCol;
} else { // 같다면 주손으로 설정
if(hand.equals("left")) {
answer += "L";
left.row = keyRow;
left.col = keyCol;
} else {
answer += "R";
right.row = keyRow;
right.col = keyCol;
}
}
}
}
return answer;
}
}
'알고리즘 > PROGRAMMERS' 카테고리의 다른 글
소수 찾기(Lv.2) (0) | 2024.03.21 |
---|---|
크레인 인형뽑기 게임(Lv.1) (0) | 2024.03.21 |
성격 유형 검사하기(Lv.1) (0) | 2024.03.21 |
신규 아이디 추천(Lv.1) (0) | 2024.03.21 |
메뉴 리뉴얼(Lv.2) (2) | 2024.03.19 |