[Programmers] 키패드 누르기
개요
2020 카카오 인턴쉽 문제
누르려는 번호가 양손과 얼마나 떨어져있는지 확인하여 풀이하는 문제
코드
public class KeyPad {
public String solution(int[] numbers, String hand) {
StringBuilder result = new StringBuilder();
int[][] keyPad = { {3,1},{0,0},{0,1},{0,2},{1,0},{1,1},{1,2},{2,0},{2,1},{2,2} }; //키패드 위치 저장
int[] left = {3,0}; //왼손 시작지점
int[] right = {3,2};//오른손 시작지점
int r, c;
boolean isLeft = false;
for(int i=0;i<numbers.length;i++) {
r = keyPad[numbers[i]][0]; //행
c = keyPad[numbers[i]][1]; //열
if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7) //왼손만 누르는 키
isLeft = true;
else if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9) //오른손만 누르는 키
isLeft = false;
else { //더 가까운 손이 누르는 키
int leftRange = Math.abs(r-left[0]) + Math.abs(c-left[1]); //왼손과 키 사이의 거리
int rightRange = Math.abs(r-right[0]) + Math.abs(c-right[1]);//오른손과 키 사이의 거리
if(leftRange < rightRange) { //왼손이 더 가까울 때
isLeft = true;
}
else if(leftRange == rightRange) { //양손 거리가 같을 때
if(hand.equals("left")) //왼손잡이 경우
isLeft = true;
else //오른손잡이 경우
isLeft = false;
}
else //오른손이 더 가까울 때
isLeft = false;
}
if(isLeft) { //왼손으로 키 누름
left[0] = r;
left[1] = c;
result.append("L");
}
else { //오른손으로 키 누름
right[0] = r;
right[1] = c;
result.append("R");
}
}
return result.toString();
}
}
해결 과정
키패드를 2차원 배열로 저장한다 그리고 입력으로 받는 숫자를 키패드배열에 매핑시켜서 손의 위치를 저장하는 방식으로 진행하였다.
문제는 중간에 위치한 키들인데(2,5,8,0) 해당 키에 더 가까운 손이 있으면 그 손을 사용하고 양 손 다 거리가 같을 경우는 어느손잡이인지에 따라 처리해준다.
댓글남기기