[Programmers] 2020 카카오 인턴십 - 키패드 누르기

Pandahun·2020년 7월 5일
0

https://programmers.co.kr/learn/courses/30/lessons/67256


숫자의 키패드에서 어떤 손이 입력하는지를 맞추는 문제.

사용자는 왼손잡이 혹은 오른손잡이고

왼손은 *에서 오른손은 #위치에서 문제가 시작된다.

1,4,7 은 왼손이, 3,6,9는 오른손이 입력하고,

2,5,8,0 은 각 손 중 더 가까운 손이 입력하고 만얀 거리가 같다면, 왼손잡이라면 왼손 오른손 잡이라면 오른손.


문제를 풀기 위해

  1. 키패드 배열 생성
  2. 입력이 각 손에 해당하는 끝 라인일 때 처리
  3. 아니라면 각 손에서 해당하는 거리 계산

순 으로 문제를 풀었다.

  1. 키패드 배열 생성
    static int[][] hands = {
            {' ', '1', '2', '3'},
            {' ', '4', '5', '6'},
            {' ', '7', '8', '9'},
            {' ', '*', '0', '#'}
    };

거리를 계산하기 위해 2차원 배열로 선언했다.

  1. 입력이 각 손에 해당하는 끝 라인 처리
public String solution(int[] numbers, String hand) {
	for (int i : numbers) {
		if (i == 1 || i == 4 || i == 7) {
			sb.append("L");
			L = i;
			continue;
		} else if (i == 3 || i == 6 || i == 9) {
			sb.append("R");
      R = i;
      continue;
    }
  }
}
  1. 각 손의 거리 계산
static int getDistance(int source, int dest) {
        int r = dest / 3;
        int c = dest % 3;
        if (c == 0) {
            c = 3;
        }
        int nr = source / 3;
        int nc = source % 3;
        if (nc == 0) {
            nr--;
            nc = 3;
        }
        return Math.abs(r - nr) + Math.abs(c - nc);
    }

각각 손마다 거리를 계산해 비교했다.


<전체 코드>

class Solution {
    
    static int[][] hands = {
            {' ', '1', '2', '3'},
            {' ', '4', '5', '6'},
            {' ', '7', '8', '9'},
            {' ', '*', '0', '#'}
    };
    
    public String solution(int[] numbers, String hand) {
        StringBuilder sb = new StringBuilder();
        int L, R, dl, dr;
        dr = dl = 0;
        L = 10;
        R = 12;
        for (int i : numbers) {
            if (i == 1 || i == 4 || i == 7) {
                sb.append("L");
                L = i;
                continue;
            } else if (i == 3 || i == 6 || i == 9) {
                sb.append("R");
                R = i;
                continue;
            }
            if (i == 0) {
                i = 11;
            }
            dl = getDistance(L, i);
            dr = getDistance(R, i);
            if (dl < dr) {
                L = i;
                sb.append("L");
            } else if (dr < dl) {
                R = i;
                sb.append("R");
            } else {
                if (hand.equals("left")) {
                    L = i;
                    sb.append("L");
                } else {
                    R = i;
                    sb.append("R");
                }
            }
        }
        return sb.toString();
    }

    static int getDistance(int source, int dest) {
        int r = dest / 3;
        int c = dest % 3;
        if (c == 0) {
            c = 3;
        }
        int nr = source / 3;
        int nc = source % 3;
        if (nc == 0) {
            nr--;
            nc = 3;
        }
        return Math.abs(r - nr) + Math.abs(c - nc);
    }
}
profile
개발하는팬더

0개의 댓글