본문 바로가기
Algorithm/Programmers

[프로그래머스(programmers)] (2020카카오 인턴십) 키패드 누르기

by 광진구뚝배기 2021. 6. 19.

알고리즘 문제 풀이 / 프로그래머스 (programmers)  - 키패드 누르기

 

 

문제 링크

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

 

코딩테스트 연습 - 키패드 누르기

[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] "right" "LRLLLRLLRRL" [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] "left" "LRLLRRLLLRR" [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] "right" "LLRLLRLLRL"

programmers.co.kr

 

 

문제 풀이

 

키패드 위치의 좌표를 배열로 만든다.

거리가 더 가까운 손의 좌표를 갱신해준다.

 

2,5,8,0 번은 왼손과 오른손 중 가까운 손으로 눌러야 하므로 좌표를 이요해야겠다는 생각을 했다. 그래서 배열 인덱스에는 키패드 번호를, 값에는 키패드 좌표를 넣어주었다. 이렇게 했을 때 keypad[n][0] 위치에 있는 값은 왼손이, keypad[n][2]는 오른손이 하는 것이고 1일때만 판별하면 된다. 거리가 같을 땐 hand에 의해 결정되므로 hand값을 설정해두고 풀면 쉽게 풀 수 있다.

 

public static String solution(int[] numbers, String hand) {
    String answer = "";
    int[][] keypad = {{3,1},{0,0},{0,1},{0,2},{1,0},{1,1},{1,2},{2,0},{2,1},{2,2},{3,0},{3,2}};

    int[] left = keypad[10];
    int[] right = keypad[11];   
    hand = hand.equals("right") ? "R" : "L";
        
    for(int i = 0; i < numbers.length; i++) {
       	int[] next = keypad[numbers[i]];
        	
       	if(next[1] == 0) {
       		answer += "L";
       	}else if(next[1] == 2) {
       		answer += "R";
       	}else {
       		int le = Math.abs(next[0] - left[0]) + Math.abs(next[1] - left[1]);
       		int ri = Math.abs(next[0] - right[0]) + Math.abs(next[1] - right[1]);
       		
            if(le==ri) {
       			answer += hand;      
       		}else {
       			answer += le < ri ? "L" : "R";	
       		}
       	}
        
       	if(answer.charAt(i)=='L') {
       		left = next;
       	}else {
       		right = next;
      	}
    }               
    return answer;
}
반응형

댓글