본문 바로가기

TIL

[2022-1-2]알고리즘 문제 풀이, 자바 프로젝트 생성 및 예제 개발

프로그래머스 Level1 - 키패드 누르기

class Solution {
      enum Vertical{
        LEFT,
        MIDDLE,
        RIGHT
    }

    public String solution(int[] numbers, String hand) {

        StringBuilder answer = new StringBuilder("");
        Hand leftHand = new Hand('*',Vertical.LEFT);
        Hand rightHand = new Hand('#',Vertical.RIGHT);

        for(int number : numbers){
            char charNumber = Character.forDigit(number,10);

            if(getVertical(number) == Vertical.LEFT){
                leftHand.setLocation(charNumber, Vertical.LEFT);
                answer.append("L");
            }
            else if(getVertical(number) == Vertical.RIGHT){
                rightHand.setLocation(charNumber,Vertical.RIGHT);
                answer.append("R");
            }
            else{

                if(leftHand.getDistance(number) > rightHand.getDistance(number)){
                    rightHand.setLocation(charNumber,Vertical.MIDDLE);
                    answer.append("R");
                }
                else if(leftHand.getDistance(number) < rightHand.getDistance(number)){
                    leftHand.setLocation(charNumber,Vertical.MIDDLE);
                    answer.append("L");
                }
                else{
                    if(hand.equals("right")){
                        rightHand.setLocation(charNumber,Vertical.MIDDLE);
                        answer.append("R");
                    }
                    else{
                        leftHand.setLocation(charNumber,Vertical.MIDDLE);
                        answer.append("L");
                    }
                }
            }
        }

        return answer.toString();
    }

    private Vertical getVertical(int number){
        if(number % 3 == 1) return Vertical.LEFT;
        else if(number % 3 == 2 || number == 0) return Vertical.MIDDLE;
        else{
            return Vertical.RIGHT;
        }
    }

    private static class Hand{

        private static final char[][] Numbers = {{'1','4','7','*'}, {'2','5','8','0'}, {'3','6','9','#'}};
        private char location;
        private int verticalIndex;

        private Hand(char location, Vertical vertical) {
            this.location = location;
            this.verticalIndex = vertical.ordinal();
        }

        public void setLocation(char location, Vertical vertical) {
            this.location = location;
            this.verticalIndex = vertical.ordinal();

        }

        private int getDistance(int number){

            char numberChar = Character.forDigit(number,10);
            int index = 0;
            int distance = 0;

            for(char middleNumber : Numbers[1]){
                if(numberChar == middleNumber) break;
                index++;
            }

            distance = Math.abs(index - getRowIndex(location));

            if(verticalIndex != 1) distance += 1;

            return distance;
        }

        private int getRowIndex(char location){
            int index = 0;
            for(char number :Numbers[verticalIndex]){
                if(number == location) return index;
                index++;
            }

            return -1;
        }
    }
}

생각보다 푸는데 오래걸렸다. 자바에 익숙해지기 위해서 새로운 클래스도 만들고 Enum도 사용해보고 하는 등 했지만 오히려 풀다보니 가독성이 더떨어져서 중간중간 혼자 더 헷갈렸다. 다행히 코드길이와 가독성과는 별개로 다른 사람들의 풀이 코드보다 속도면에서는 훨씬 빨랐다. 내일은 새로운 문제풀이가 아니라 이 문제 코드의 가독성을 높힐 수 있을 만한 방법을 생각해봐야겠다.

 

처음 사용해본 것

Enum

Enum 비교는 == 으로 하기

static final MONDAY = 1;
static final TUESDAY = 2;
static final WEDNESDAY = 3;

static final JANUARY = 1;
static final FEBRUARY = 2;
.
.
.
static final OCTOBER = 10;

위와 같은 코드가 있다고 할 때 MONDAY == JANUARY 이다. 개발자가 두 상수를 사용하는 의미는 다르겠지만 이러한 상수가 무수히 많고 int dayOfWeek = OCTOBER 와 같은 논리적 오류가  발생해도 개발자가 이에 대해 따로 유효성 검사를 하지않으면 컴파일러는 이 것을 발견할 수 없다. Enum 을 통해 이러한 문제점을 방지할 수 있다.

 

일단 enum 의 비교와 간단한 사용법 정도만 문제풀이를 위해서 알아봤는데 enum 이라는 객체에 대해서 어떻게 작동하는지 추후 다시 정리해 봐야겠다.

 

Character.forDigit(int digit, int radix);

Character.forDigit 메서드 구현

int 형 한자리 정수를 char 형으로 변환하는 메서드. digit 은 진수를 나타낸다. 10진수면 10을 넣어주면 된다.

바르지 못한 정수를 입력하면 널문자 '\0' 을 반환한다.

 

스프링 핵심 원리 - 기본편) 스프링 핵심 원리 이해1 - 예제 만들기 수강

처음에는 순수한 자바로 간단한 주문시스템을 구현한 뒤, 객체지향을 위해 Spring 프레임워크가 어떠한 기능을 제공해주는지 순차적으로 수업이 진행된다. 이번 챕터에서는 일단 자바로 간단한 주문시스템만 구현했다.