- 객체를 만들고, 2차배열로 키패드를 구현해서 풀이했다.
- 다른 사람의 풀이는 숫자를 인덱스로 보고, 숫자의 위치를 2차 배열로 넣어주었다.
- 반복문을 통해서 위치를 찾아내는 내 코드보다 더 효율적인 방법이다.
- 문제 그대로 틀에 박혀서 구현하기 보다, 효율적인 해결 방법을 고민하도록 해야겠다.
class Solution {
public static int[][] keypad = new int[][]{ {1,2,3}, {4,5,6}, {7,8,9}, {-1,0,-1}};
public String solution(int[] numbers, String hand) {
String answer = new User(hand).memorize(numbers);
return answer;
}
public static class User {
StringBuilder stringBuilder;
String majorHand;
int[] leftPosition;
int[] rightPosition;
User(String majorHand) {
stringBuilder = new StringBuilder();
this.majorHand = majorHand;
leftPosition = new int[]{3, 0};
rightPosition = new int[]{3, 2};
}
String memorize(int[] numbers) {
for (int number : numbers) {
stringBuilder.append(findPosition(number));
}
return stringBuilder.toString();
}
boolean isLeftHand(int col) {
return col == 0;
}
boolean isRightHand(int col) {
return col == 2;
}
String moveLeftHand(int row, int col) {
leftPosition[0] = row;
leftPosition[1] = col;
return "L";
}
String moveRightHand(int row, int col) {
rightPosition[0] = row;
rightPosition[1] = col;
return "R";
}
String findPosition(int number) {
int row = 0;
int col = 0;
for (int i = 0; i < keypad.length; i++) {
int length = keypad[i].length;
for (int j = 0; j < length ; j++) {
if(keypad[i][j] == number) {
row = i;
col = j;
break;
}
}
}
if(isLeftHand(col)) {
return moveLeftHand(row,col);
}
if(isRightHand(col)) {
return moveRightHand(row,col);
}
return findHand(row,col);
}
String findHand(int row, int col) {
int leftDistance = Math.abs(leftPosition[0] - row) + Math.abs(leftPosition[1] - col);
int rightDistance = Math.abs(rightPosition[0] - row) + Math.abs(rightPosition[1] - col);
if(leftDistance > rightDistance) {
return moveRightHand(row,col);
}
if (leftDistance < rightDistance) {
return moveLeftHand(row,col);
}
return isMajorHand(row, col);
}
String isMajorHand(int row, int col) {
if(majorHand.equals("left")) {
return moveLeftHand(row,col);
}
return moveRightHand(row,col);
}
}
}
해커스랭크
public static int diagonalDifference(List<List<Integer>> arr) {
int left = 0;
int right = 0;
int count = arr.size();
for (int i = 0, j = count -1; i < count; i++, j--) {
left += arr.get(i).get(i);
right += arr.get(i).get(j);
}
return Math.abs(left-right);
}
public static String timeConversion(String s) {
String[] splited = s.split(":");
int hour = Integer.parseInt(splited[0]);
String minute =splited[1];
String second = splited[2].substring(0,2);
String meridiem = splited[2].substring(2,4);
if(meridiem.equals("AM") && hour == 12){
hour = 0;
}
if(meridiem.equals("PM")&& hour < 12) {
hour += 12;
}
String answer = String.format("%02d:%s:%s",hour,minute,second);
return answer;
}
public static String kangaroo(int x1, int v1, int x2, int v2) {
if(v1 <= v2) {
return "NO";
}
if((x1-x2) % (v2-v1) == 0) {
return "YES";
}
return "NO";
}
public static int saveThePrisoner(int n, int m, int s) {
int answer = (s+m-1) % n;
if(answer == 0) {
answer = n;
}
return answer;
}