JAVA/Coding Test

[JAVA] 프로그래머스 kakao 키패드 누르기

오늘도개발 2024. 5. 23. 14:20

 

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

 

프로그래머스

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

programmers.co.kr

 

 

접근 : 

 

 - 키 패드의 위치를 왼손, 오른손 따로 저장

 

 - 1,4,7 은 왼손 3, 6, 9 는 오른손으로 누름

 

 - 2, 5, 8, 0 은 가까운 손으로 누르고, 만약 거리가 같다면 주로 사용하는 손을 사용

 

 - 키패드의 위치를 좌표로 저장하고, 위의 조건 대로 이동하면서 사용한 손의 방향을 출력

 

1, 9, 5, 8, 2, 0 을 입력하는 경우

 

 

 

 

 

코드구현 

 

import java.util.*;

class Position{
    int x;
    int y;
    
    public Position(int x, int y){
        this.x = x;
        this.y = y;
    }
    
    private int calLength(int a, int b){
        return (a - b) > 0 ? a-b : b-a;
    }
    
    int getLength(Position target){
        return calLength(this.x,target.x) + calLength(this.y,target.y);
    }
}

class Solution {
    public String solution(int[] numbers, String hand) {
        StringBuilder sb = new StringBuilder();
        Map<Integer, Position> keyMap = new HashMap<Integer, Position>();
        
        int idx = 0;
        keyMap.put(idx++,new Position(1,0));
        
        for(int i = 0 ; i < 3 ; i++){
            for(int j = 0 ; j < 3 ; j++){
                 keyMap.put(idx++, new Position(j, 3-i));
            }
        }

        Position left = new Position(0,0);
        Position right = new Position(2,0);
        
        int distance_l = 0;
        int distance_r = 0;
        
        for(int n : numbers){
            
            if(n == 1 || n ==4 || n == 7){
                left = keyMap.get(n);
                sb.append('L');
                continue;
            }
            
            if(n == 3||n == 6||n == 9){
                right = keyMap.get(n);
                sb.append('R');
                continue;
            }
            
            // 2, 5, 8, 0 의 경우
            distance_l = left.getLength(keyMap.get(n));
            distance_r = right.getLength(keyMap.get(n));
            
            if(distance_l < distance_r){
                left = keyMap.get(n);
                sb.append('L');
                continue;
            }
            
            if(distance_l > distance_r){
                right = keyMap.get(n);
                sb.append('R');
                continue;
            }
            
            if(hand.equals("left")){
                left = keyMap.get(n);
                sb.append('L');
                continue;
            }
            right = keyMap.get(n);
            sb.append('R');
            }
        }
        return sb.toString();
    }
}