[ Programmers ] 키패드 누르기 (Java)

ma.caron_g·2021년 5월 16일
0

Lv.1 - Programmers (완성)

목록 보기
20/74
post-thumbnail

1. Problem 📃

[ 키패드 누르기 ]
https://programmers.co.kr/learn/courses/30/lessons/67256


2. Constraint 🔗


3. Solution 🔑

  1. 이중 for문(i, j)을 돌렸을 때, j=0 일 때 왼손을 가지고 j=2 일 때 오른손을 입력
  2. 배열 LH와 RH는 마지막 번호를 눌렀을 때의 그 번호의 위치(인덱스)를 표시
  3. 이중 for문으로 배열 전체를 탐색하여 입력받은 숫자의 위치를 input[0]과 input[1]의 각각 넣어주었다.
  4. j=0이면 왼손 위치(LH)의 요소를 변경하고 "L"을 answer에 추가, j=2이면 오른손 위치(RH)의 요소를 변경하고 "R"을 추가 j=1이면 Math.abs()를 이용하여 현재 손 위치에서 눌러야하는 번호의 위치까지 몇칸을 움직여야하는지 구하고 적은 값이 answer에 추가되며, 값이 같을시 입력받은 사용하는 손을 추가.
  5. answer을 반환.

4. Code 💻

class Solution {
    public String solution(int[] numbers, String hand) {
       String answer = "";

		int key[][] = {{1, 2, 3},
				{4, 5, 6,},
				{7, 8, 9},
				{42, 0 ,35}};
		int LH[] = {3, 0};
		int RH[] = {3, 2};
		int input[] = new int[2];
		
		
		
		for(int p=0; p<numbers.length; p++) {
			for(int i=0; i<4; i++) {
				for(int j=0; j<3; j++) {
					if(key[i][j] == numbers[p]) {
						input[0] = i;
						input[1] = j;
						if(j==0) {
							LH[0] = i;
							LH[1] = j;
							answer += "L";
						}
						else if(j==2) {
							RH[0] = i;
							RH[1] = j;
							answer += "R";
						}
						else if(j==1) {
							int L = Math.abs((LH[0] - input[0])) + Math.abs((LH[1] - input[1]));
							int R = Math.abs((RH[0] - input[0])) + Math.abs((RH[1] - input[1]));
							
							if(L>R) {
								answer += "R";
								RH[0] = i;
								RH[1] = j;
							}
							else if(L<R) {
								answer += "L";
								LH[0] = i;
								LH[1] = j;
							}
							else if(L==R) {
								answer += hand.toUpperCase().toCharArray()[0];
								if(hand.toUpperCase().equals("RIGHT")) {
									RH[0] = i;
									RH[1] = j;
								}
								else if(hand.toUpperCase().equals("LEFT")) {
									LH[0] = i;
									LH[1] = j;
								}
							}
							
						}
					}
				}
			}
		}
		return answer;
    }
}

5. Growth 🍄

Math.abs()란? 괄호안에 있는 값의 절대값을 구해주는 함수

처음에 어떻게 헤쳐나갈까 생각을 하다가
손이 위 아래로(i) 움직이면 +3/-3 양옆으로(j) 움직이면 +1/-1을 i(3), j(1)에 해당하는 값에 각각 움직인 횟수를 곱해 왼손과 오른손중 낮은 값을 계산하여 구하려하였는데 +3과 -3, +1과 -1은 딱히 신경 안써도 되는 부분이여서
지금 왼손 오른손 위치에서 목표 지점까지의 좌표로 가기위해 몇칸을 움직였는지 생각하면 풀기 편했다. 카카오문제라 걱정을 했지만, 차근차근 풀다보니 풀어볼 수 있었고 풀은 기분은 짜릿했다.

profile
다른 사람이 만든 것을 소비하는 활동보다, 내가 생산적인 활동을 하는 시간이 더 많도록 생활화 하자.

0개의 댓글