프로그래머스 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);
int 형 한자리 정수를 char 형으로 변환하는 메서드. digit 은 진수를 나타낸다. 10진수면 10을 넣어주면 된다.
바르지 못한 정수를 입력하면 널문자 '\0' 을 반환한다.
스프링 핵심 원리 - 기본편) 스프링 핵심 원리 이해1 - 예제 만들기 수강
처음에는 순수한 자바로 간단한 주문시스템을 구현한 뒤, 객체지향을 위해 Spring 프레임워크가 어떠한 기능을 제공해주는지 순차적으로 수업이 진행된다. 이번 챕터에서는 일단 자바로 간단한 주문시스템만 구현했다.
'TIL' 카테고리의 다른 글
[2022-1-5]문제를 똑바로 읽자 / 스프링 핵심원리 기본편 AppConfig 구현 (0) | 2022.01.05 |
---|---|
[2022-1-4] Stack<E> 뜯어보기 (2) | 2022.01.05 |
[2022-1-3]프로그래머스 연습 문제 리팩토링 (0) | 2022.01.04 |
[2022-1-1] 자바 객체지향, SOLID 법칙 (0) | 2022.01.02 |
[2021-12-30,31] 프로그래머스 연습 + 정규표현식 (0) | 2022.01.01 |