문제
https://school.programmers.co.kr/learn/courses/30/lessons/67256
풀이
구현 문제입니다. 우선 키패드 간의 거리는 행렬 격자 상에 있다고 가정했습니다.
키패드를 누를 때마다 현재 left, right의 위치가 갱신됩니다. 그리고 다음 번호와 left, right의 거리를 비교해야합니다.
저는 각 번호를 행렬의 열과 행으로 바꾸어준 뒤, Math.abs(r1-r2)+Math.abs(c1-c2)의 식을 통해 거리를 계산했습니다.
해당 번호를 각각의 행과 열로 표현하기 위해서 mod 연산과 나머지 연산을 이용했습니다. 그리고 예외적인 0과 *, # 는 따로 처리를 해줍니다.
주의해야할 것은 두 손가락의 시작 위치가 기본적으로 세팅되어있다는 것입니다.
아래는 소스 코드입니다.
소스 코드
class Solution {
public String solution(int[] numbers, String hand) {
String answer = "";
int left = -1;
int right = -2;
for(int i = 0;i<numbers.length;i++){
int number = numbers[i];
if(number == 1||number == 4||number == 7){
left = number;
answer+="L";
}
else if(number == 3||number == 6||number == 9){
right = number;
answer+="R";
}
else{
if(getDistance(number, left)<getDistance(number, right)){
left = number;
answer+="L";
}
else if(getDistance(number, left)>getDistance(number, right)){
right = number;
answer+="R";
}
else{
if(hand.equals("left")){
left = number;
answer+="L";
}
else{
right = number;
answer+="R";
}
}
}
}
return answer;
}
static int getDistance(int number, int finger){
int r = (number-1)/3;
int c = (number-1)%3;
if(number == 0){
r=3;
c=1;
}
int fingerR = (finger-1)/3;
int fingerC = (finger-1)%3;
if(finger == -1){
fingerR=3;
fingerC=0;
}
if(finger == -2){
fingerR=3;
fingerC=2;
}
if(finger == 0){
fingerR=3;
fingerC=1;
}
return Math.abs(r-fingerR)+Math.abs(c-fingerC);
}
}
'Java > 프로그래머스' 카테고리의 다른 글
[프로그래머스] Lv2. 메뉴 리뉴얼 (0) | 2024.06.11 |
---|