카카오 기출 쉬운 문제부터 뿌시기 !
이번에 푼 문제는 키패드 누르기 ! 나 이 때 코테 봤던거 가태.. 문제 풀었었어.. 코테에서..
이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.
맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.
numbers | hand | result |
---|---|---|
[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] | "right" | "LRLLLRLLRRL" |
[7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] | "left" | "LRLLRRLLLRR" |
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0] | "right" | "LLRLLRLLRL" |
먼저 키패드에서 각 숫자의 위치와 손가락의 위치가 중요한 문제이기 때문에 위치를 나타내는 Position 클래스를 만들어서 위치를 나타낼 수 있게해주었다.
그리고 키패드 위치를 정의해둬야 하기 때문에 index가 숫자이고, 원소가 위치이게끔 Position 타입 배열을 정의해두었다.
후에 왼손가락, 오른손가락에 초기 위치를 지정해주고 각 숫자들에 대해서 키패드 누르기를 진행했다.
키패드 누르기 과정은 정의해둔 키패드를 통해서 현재 숫자의 위치를 받아와서 위치가 0열이면 왼손, 2열이면 오른손으로 정해주었다. 그 외에 1열이면 현재 위치와 왼손가락, 오른손가락의 위치를 이용하여 거리를 계산하여 그 결과를 이용해서 더 가까운 곳, 같다면 입력으로 들어온 hand값을 이용하여 누르는 손가락을 정해주었다.
그 값으로 R 혹은 L을 결과 문자열에 더해주었고, 그에 맞게 현재 손가락의 위치도 업데이트 해주면된다.
간단한 문제여서 쉽게 풀었고, 코드도 직관적이라서 쉽게 이해할 수 있을 것이다 ~
class Solution {
static class Position{
private int row;
private int col;
Position(int row, int col){
this.row = row;
this.col = col;
}
public void setPosition(Position newPosition){
this.row = newPosition.row;
this.col = newPosition.col;
}
}
static int calDistance(Position from, Position to){
return Math.abs(from.row - to.row) + Math.abs(from.col - to.col);
}
static Position[] keypad = {new Position(3, 1), new Position(0, 0), new Position(0, 1), new Position(0, 2),
new Position(1, 0), new Position(1, 1), new Position(1, 2),
new Position(2, 0), new Position(2, 1), new Position(2, 2)};
public String solution(int[] numbers, String hand) {
StringBuilder answer = new StringBuilder();
if(hand.equals("left")) hand = "L";
else hand = "R";
Position curLeft = new Position(3, 0);
Position curRight = new Position(3, 2);
Position current;
String curHand;
int distanceL, distanceR;
for(int i=0; i<numbers.length; i++){
current = keypad[numbers[i]];
if(current.col == 0) curHand = "L";
else if (current.col == 2) curHand = "R";
else{
distanceL = calDistance(curLeft, current);
distanceR = calDistance(curRight, current);
if(distanceL > distanceR) curHand = "R";
else if (distanceL < distanceR) curHand = "L";
else curHand = hand;
}
answer.append(curHand);
if(curHand.equals("L")) curLeft.setPosition(current);
else curRight.setPosition(current);
}
return answer.toString();
}
}