하루살이 개발자

[프로그래머스] Level1 - 키패드 누르기(Java) 본문

코딩테스트

[프로그래머스] Level1 - 키패드 누르기(Java)

하루살이 2022. 8. 7. 21:29

문제 

왼손 엄지와 오른손 엄지로 키패드를 누를 때 주어진 규칙을 반영하여 어떤 손가락으로 눌렀는지 return하는 문제.

왼손 엄지와 오른손 엄지 중 눌러야 할 번호가 더 가까운 손가락이 어딘지 판단하는 데 시간 오래걸림.

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

코드

class Solution {
    public String solution(int[] numbers, String hand) {
        //String answer = "";
        StringBuilder answer = new StringBuilder();

        int leftHand = 10; // 왼손 엄지
        int rightHand = 12; // 오른손 엄지
        int LD, RD;

        for(int temp : numbers){
            if(temp == 1 | temp == 4 | temp == 7){
                //answer+="L";
                answer.append("L");
                leftHand = temp; // 현재 왼손 엄지 위치 저장
            }
            else if(temp == 3 | temp == 6 | temp == 9){
                answer.append("R");
                rightHand = temp; // 현재 오른손 엄지 위치 저장
            }
            else{
                if(temp == 0){
                    temp = 11; // 0은 11로 보기
                }
                LD = (Math.abs(leftHand - temp)) / 3 + (Math.abs(leftHand - temp)) % 3; // 왼손 거리
                RD = (Math.abs(rightHand - temp)) / 3 + (Math.abs(rightHand - temp)) % 3; // 오른손 거리
                if(LD == RD){ // 거리 같을 경우
                    if(hand.equals("left")){ // hand == "left"일때 테케 실패함
                    answer.append("L");
                    leftHand = temp;
                    }else{
                    answer.append("R");
                    rightHand = temp;  
                    }

                }else if(LD < RD){ // 왼손이 더 유리
                    answer.append("L");
                    leftHand = temp;       
                }else{ // 오른손이 더 유리
                    answer.append("R");
                    rightHand = temp;
                }
               
            }

        }
        return answer.toString();
    }
}

* 주의

// 주의1
String answer = " "; 로 초기화시

answer += "L"; (ok)
answer.append("L"); (no!!) -> StringBuilder answer = new StringBuilder(); 로 선언시 가능

why?
StringBuilder가 String과 가장 다른 점은 '수정 가능'하다는 것이다. 

결론!
String a = "a"; // string으로 선언하는경우
a += "b"; // 보통 +로 문자열 더함

StringBuilder a = new StringBuilder(); // StringBuilder로 선언하는 경우
a.append(b); // append로 문자열 더하기
return a.toString(); // return시 .toString()이용

// 문자열 더하는 방법 3가지 
a = "a";
b = "b";

1. a.concat(b)
2. a + b
3. a.append("b")


// 주의2
// str.equals() 과 == 의 차이

hand = "right"; 일때 

hand == "right" 로 코드를 작성하여 일부 테스트 케이스가 실패했다.

why?
a.equals(b)는 말 그대로 a와 b가 가지는 값이 같은지를 true false로 나타내는 것이고,
a == b는 a의 주소값과 b의 주소값이 같은지를 true false로 나타내는 것이다.

결론!
string은 equals로 비교하자!!