프로그래머스-2020 카카오 인턴십 ( 키패드 누르기 by Java )

Flash·2022년 2월 1일
0

Programmers-Algorithm

목록 보기
8/52
post-thumbnail

2차원 배열 이용하기

프로그래머스 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 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은 가운데에 위치했기 때문에 어느 손을 쓸지 결정해줘야 하므로 따로 메소드를 선언해서 이용했다.

이 메소드가 할 역할은 다음과 같다.

  1. 왼손과 오른손의 2,5,8,0까지의 거리를 각각 계산한다.
  2. 더 가까운 손으로 누르고 누른 손의 위치를 갱신해주자.

코드로 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";
            }
        }
    }

각 키패드의 번호를 숫자 그대로 받아들이지 않고 rowcol의 개념으로 받아들인다면 매우 쉽게 해결이 가능한 문제였다. 문제를 풀 때 주어진 정보 그대로 받아들이기보다는 문제 해결을 위해 어떤 형태로 조작하면 더 쉽게 해결이 가능할지를 고민하는 눈으로 살펴봐야 함을 느끼게 해준 문제였다.

다음은 위 코드를 모두 합쳐 내가 제출한 코드다.

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();
    }
}
profile
개발 빼고 다 하는 개발자

0개의 댓글