프로그래머스 2020 카카오 인턴 Level 1 키패드 누르기를 Java를 이용해 풀어보았다. int[][]
을 이용하면 쉽고 직관적인 풀이가 가능한 문제다.
문제 링크 첨부한다.
https://programmers.co.kr/learn/courses/30/lessons/67256
글보다 그림이 훨씬 이해하기 쉬울 듯하다. 이렇게 각 번호를 위치 정보로서 이차원 배열을 이용해서 지정해준다. 가장 초기의 왼손과 오른손의 위치는 (3,0)
과 (3,2)
로 초기화해주고 시작하면 된다.
이를 표현한 코드는 다음과 같다.
static int[] whereLeft = {3,0};
static int[] whereRight = {3,2};
static int[][] keypad = { {3,1}, {0,0}, {0,1}, {0,2}, {1,0}, {1,1}, {1,2}, {2,0}, {2,1}, {2,2} }; // 0부터 9까지
눌러야 할 번호 배열을 for each
문을 이용해 순회하며 switch
문을 이용해 어느 손을 이용해줄지 판단하면 된다. 코드가 설명보다 더 간단하니 코드로 확인해보자.
for(int num: numbers){
switch(num){
case 1: case 4: case 7: // 왼손 쓸 때
answer += "L";
whereLeft = keypad[num]; // 손의 위치를 미리 선언한 keypad 배열을 이용해 갱신하자
break;
case 3: case 6: case 9: // 오른손 쓸 때
answer += "R";
whereRight = keypad[num];
break;
default: // 어느 손 쓸지 결정해야 한다
answer += whichHand(num, hand);
}
}
위 코드를 보면 whichHand(num, hand)
라는 메소드를 볼 수 있다. 2,5,8,0
은 가운데에 위치했기 때문에 어느 손을 쓸지 결정해줘야 하므로 따로 메소드를 선언해서 이용했다.
이 메소드가 할 역할은 다음과 같다.
- 왼손과 오른손의
2,5,8,0
까지의 거리를 각각 계산한다.- 더 가까운 손으로 누르고 누른 손의 위치를 갱신해주자.
코드로 whichHand
메소드를 확인해보자.
static String whichHand(int num, String hand){
int[] target = keypad[num];
int distanceFromLeft = Math.abs(whereLeft[0]-target[0]) + Math.abs(whereLeft[1]-target[1]);
int distanceFromRight = Math.abs(whereRight[0]-target[0]) + Math.abs(whereRight[1]-target[1]);
if(distanceFromLeft<distanceFromRight){ // 왼손이 더 가까울 때
whereLeft = target;
return "L";
}
else if(distanceFromLeft>distanceFromRight){ // 오른손이 더 가까울 때
whereRight = target;
return "R";
}
else{ // 거리 같을 때
if(hand.equals("left")){ // 왼손잡이면 왼손으로 누르고
whereLeft = target;
return "L";
}
else{ // 오른손잡이면 오른손 쓰자
whereRight = target;
return "R";
}
}
}
각 키패드의 번호를 숫자 그대로 받아들이지 않고 row
와 col
의 개념으로 받아들인다면 매우 쉽게 해결이 가능한 문제였다. 문제를 풀 때 주어진 정보 그대로 받아들이기보다는 문제 해결을 위해 어떤 형태로 조작하면 더 쉽게 해결이 가능할지를 고민하는 눈으로 살펴봐야 함을 느끼게 해준 문제였다.
다음은 위 코드를 모두 합쳐 내가 제출한 코드다.
import java.io.*;
public class Keypad {
static int[] whereLeft = {3,0};
static int[] whereRight = {3,2};
static int[][] keypad = { {3,1}, {0,0}, {0,1}, {0,2}, {1,0}, {1,1}, {1,2}, {2,0}, {2,1}, {2,2} };
static String solution(int[] numbers, String hand) {
String answer = "";
for(int num: numbers){
switch(num){
case 1: case 4: case 7:
answer += "L";
whereLeft = keypad[num]; // 손의 위치를 row 로 표현하자
break;
case 3: case 6: case 9:
answer += "R";
whereRight = keypad[num];
break;
default:
answer += whichHand(num, hand);
}
}
return answer;
}
static String whichHand(int num, String hand){
int[] target = keypad[num];
int distanceFromLeft = Math.abs(whereLeft[0]-target[0]) + Math.abs(whereLeft[1]-target[1]);
int distanceFromRight = Math.abs(whereRight[0]-target[0]) + Math.abs(whereRight[1]-target[1]);
if(distanceFromLeft<distanceFromRight){ // 왼손이 더 가까울 때
whereLeft = target;
return "L";
}
else if(distanceFromLeft>distanceFromRight){ // 오른손이 더 가까울 때
whereRight = target;
return "R";
}
else{ // 거리 같을 때
if(hand.equals("left")){
whereLeft = target;
return "L";
}
else{
whereRight = target;
return "R";
}
}
}
public static void main(String args[]) throws IOException {
BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(System.out));
int[] numbers = {1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5}; String hand = "right";
bfw.write(solution(numbers, hand));
bfw.close();
}
}