이번에 풀어본 문제는
프로그래머스 키패드 누르기 입니다.
import java.util.*;
class Pad
{
int x,y;
public Pad(int x, int y)
{
this.x = x;
this.y = y;
}
}
class Solution {
static Pad left,right;
public String solution(int[] numbers, String hand) {
Pad [] pad = new Pad[10];
left = new Pad(3,0);
right = new Pad(3,2);
int tmpNum = 1;
for(int i = 0; i < 3; ++i)
{
for(int j = 0; j < 3; ++j)
{
pad[tmpNum++] = new Pad(i,j);
}
}
pad[0] = new Pad(3,1);
StringBuilder sb = new StringBuilder();
for(int number : numbers)
{
if(number == 1 || number == 4 || number == 7)
{
sb.append("L");
left.x = pad[number].x;
left.y = pad[number].y;
continue;
}
else if(number == 3 || number == 6 || number == 9)
{
sb.append("R");
right.x = pad[number].x;
right.y = pad[number].y;
continue;
}
else
{
int fromLeft = Math.abs(left.x - pad[number].x) + Math.abs(left.y - pad[number].y);
int fromRight = Math.abs(right.x - pad[number].x) + Math.abs(right.y - pad[number].y);
if(fromLeft > fromRight)
{
sb.append("R");
right.x = pad[number].x;
right.y = pad[number].y;
}
else if(fromLeft < fromRight)
{
sb.append("L");
left.x = pad[number].x;
left.y = pad[number].y;
}
else
{
if(hand.equals("left"))
{
sb.append("L");
left.x = pad[number].x;
left.y = pad[number].y;
}
else
{
sb.append("R");
right.x = pad[number].x;
right.y = pad[number].y;
}
}
}
}
return sb.toString();
}
}
카카오 인턴십 기출문제입니다.
pad 배열은 인덱스가 해당 번호가 되며 각각 자신의 번호에 맞는 좌표값을 가집니다. 주어진 numbers 배열을 탐색하며 2,5,8,0일 경우에는 현재 손가락의 위치로부터 거리를 계산합니다. 각 좌표값 차이의 절댓값을 더하게되면 직선경로가 아닌 x축,y축간의 이동경로를 구할 수 있으므로 해당 값을 비교하여 거리를 판단합니다.
너무도 당연하게 피타고라스 공식을 활용한 식을 짰다가, 직선거리에 대한 반례를 발견하여 식을 변경했습니다.