키패드 누르기
[50점코드 1차시도]
import java.util.*;
class Solution {
static int []dy = {0,0,1,-1};
static int []dx = {1,-1,0,0};
static String answer = "";
static char [][] map ={{'1','2','3'},{'4','5','6'},{'7','8','9'},{'*','0','#'}};
static int cur_LX=0;
static int cur_LY=3;
static int cur_Llen =0;
static int cur_RX=2;
static int cur_RY=3;
static int cur_Rlen =0;
static public void dfs(int[] numbers, String hand,int cur,int end_size)
{
if(cur == end_size)
{
return;
}
if(numbers[cur]==1 || numbers[cur]==4 || numbers[cur]==7)
{
for(int i=0;i<map.length;i++)
{
for(int j=0;j<map[i].length;j++)
{
if(map[i][j]==Integer.toString(numbers[cur]).charAt(0))
{
cur_LX = j;
cur_LY = i;
// System.out.println(i + " " + j);
}
}
}
answer+='L';
}
else if(numbers[cur]==3 || numbers[cur]==6 || numbers[cur]==9)
{
for(int i=0;i<map.length;i++)
{
for(int j=0;j<map[i].length;j++)
{
if(map[i][j]==Integer.toString(numbers[cur]).charAt(0))
{
cur_RX = j;
cur_RY = i;
// System.out.println(i + " " + j);
}
}
}
answer+='R';
}
else
{
int tempY=0;
int tempX=0;
for(int i=0;i<map.length;i++)
{
for(int j=0;j<map[i].length;j++)
{
if(map[i][j]==Integer.toString(numbers[cur]).charAt(0))
{
tempX = j;
tempY = i;
cur_Llen = Math.abs(i-cur_LY) + Math.abs(j-cur_LX);
cur_Rlen = Math.abs(i-cur_RY) + Math.abs(j-cur_RX);
// System.out.println(cur_Llen + " " + cur_Rlen);
}
}
}
if(cur_Llen == cur_Rlen)
{
// System.out.println(numbers[cur]);
if(hand.charAt(0)=='l')
{
cur_LY = tempY;
cur_LX = tempX;
answer+='L';
}
else
{
cur_RY = tempY;
cur_RX = tempX;
answer+='R';
}
}
else if(cur_Llen ==1 || cur_Rlen ==1)
{
if(cur_Rlen ==1)
{
answer+='R';
cur_RX = tempX;
cur_RY = tempY;
}
else
{
answer+='L';
cur_LX = tempX;
cur_LY = tempY;
}
}
else
{
// System.out.println(numbers[cur]);
if(cur_Llen>cur_Rlen)
{
cur_RY = tempY;
cur_RX = tempX;
answer+='R';
}
else if(cur_Llen<cur_Rlen)
{
cur_LY = tempY;
cur_LX = tempX;
answer+='L';
}
else
{
if(hand.charAt(0)=='l')
{
cur_LY = tempY;
cur_LX = tempX;
answer+='L';
}
else
{
cur_RY = tempY;
cur_RX = tempX;
answer+='R';
}
}
}
}
dfs(numbers,hand,cur+1,end_size);
}
public String solution(int[] numbers, String hand) {
dfs(numbers,hand,0,numbers.length);
return answer;
}
}
처음에 abs를 한쪽에만 붙여줘서 계산이 이상하게 나왔다... 이것도 정말 오래걸렸다...
50점 맞는데 3시간 걸린듯... 이렇게해가지고 코딩테스트를 볼지 몰겄다... 하지만 꾸준히 하면 늘겠지...
[100점코드 2차시도]
import java.util.*;
class Solution {
static int []dy = {0,0,1,-1};
static int []dx = {1,-1,0,0};
static String answer = "";
static char [][] map ={{'1','2','3'},{'4','5','6'},{'7','8','9'},{'*','0','#'}};
static int cur_LX=0;
static int cur_LY=3;
static int cur_Llen =0;
static int cur_RX=2;
static int cur_RY=3;
static int cur_Rlen =0;
static public void dfs(int[] numbers, String hand,int cur,int end_size)
{
if(cur == end_size)
{
return;
}
if(numbers[cur]==1 || numbers[cur]==4 || numbers[cur]==7)
{
for(int i=0;i<map.length;i++)
{
for(int j=0;j<map[i].length;j++)
{
if(map[i][j]==Integer.toString(numbers[cur]).charAt(0))
{
cur_LX = j;
cur_LY = i;
// System.out.println(i + " " + j);
}
}
}
answer+='L';
}
else if(numbers[cur]==3 || numbers[cur]==6 || numbers[cur]==9)
{
for(int i=0;i<map.length;i++)
{
for(int j=0;j<map[i].length;j++)
{
if(map[i][j]==Integer.toString(numbers[cur]).charAt(0))
{
cur_RX = j;
cur_RY = i;
// System.out.println(i + " " + j);
}
}
}
answer+='R';
}
else
{
int tempY=0;
int tempX=0;
for(int i=0;i<map.length;i++)
{
for(int j=0;j<map[i].length;j++)
{
if(map[i][j]==Integer.toString(numbers[cur]).charAt(0))
{
tempX = j;
tempY = i;
cur_Llen = Math.abs(i-cur_LY) + Math.abs(j-cur_LX);
cur_Rlen = Math.abs(i-cur_RY) + Math.abs(j-cur_RX);
// System.out.println(cur_Llen + " " + cur_Rlen);
}
}
}
if(cur_Llen == cur_Rlen)
{
// System.out.println(numbers[cur]);
if(hand.charAt(0)=='l')
{
cur_LY = tempY;
cur_LX = tempX;
answer+='L';
}
else
{
cur_RY = tempY;
cur_RX = tempX;
answer+='R';
}
}
else if(cur_Llen>cur_Rlen)
{
cur_RY = tempY;
cur_RX = tempX;
answer+='R';
}
else if(cur_Llen<cur_Rlen)
{
cur_LY = tempY;
cur_LX = tempX;
answer+='L';
}
else
{
if(hand.charAt(0)=='l')
{
cur_LY = tempY;
cur_LX = tempX;
answer+='L';
}
else
{
cur_RY = tempY;
cur_RX = tempX;
answer+='R';
}
}
}
dfs(numbers,hand,cur+1,end_size);
}
public String solution(int[] numbers, String hand) {
dfs(numbers,hand,0,numbers.length);
return answer;
}
}
남의코드 구조를 보고 그냥 맞게 변형한건데 어느케이스에서 위코드가 안됐는지는 아직 분석을 못했다.
지금 새벽 3시 20분이므로 잠을 자야겠다.