[프로그래머스, Java][카카오 인턴] 키패드 누르기

2025. 7. 21. 18:13·CodingTest/Programmers

사진을 클릭하면 해당 문제로 이동

⭐아이디어

1 4 7 은 무조건 왼손
3 6 9 는 무조건 오른손
2 5 8 0 은 현재 양손 중 가까운 곳 but 거리가 같으면 주손


키패드의 배열 번호
00 01 02
10 11 12
20 21 22
30 31 32


ex) 왼손 1번에서 5번으로 간다?
2칸 이동해야함 00 -> 01 -> 11
즉 |0-1| + |0-1| = 2 를 통해서 구할 수 있음


1. 왼손과 오른손 위치를 저장해둘 필드를 만들자
2. 숫자형태로 1=0 2=1 3=2 4=10 ... map에 저장하자
3. 꺼내면서 판단하자

💡풀이

import java.util.HashMap;
import java.util.Map;

class Solution {
    public String solution(int[] numbers, String hand) {
        StringBuilder answer = new StringBuilder();
        Map<Integer, Integer> map = new HashMap<>();

        for(int i = 1; i < 10; i++) {
            int row = (i - 1) / 3;
            int col = (i - 1) % 3;
            map.put(i, row * 10 + col);
        }
        map.put(0, 31);   // 0의 좌표
        map.put(11, 30);  // *의 좌표
        map.put(12, 32);  // #의 좌표

        int nowL = 11;
        int nowR = 12;

        for(int number : numbers) {
            char handToUse;
            
            switch(number) {
                case 1, 4, 7:
                    handToUse = 'L';
                    break;
                case 3, 6, 9:
                    handToUse = 'R';
                    break;
                default: // 2, 5, 8, 0
                    int rangeL = getDistance(nowL, number, map);
                    int rangeR = getDistance(nowR, number, map);

                    if(rangeL < rangeR) {
                        handToUse = 'L';
                    } else if(rangeR < rangeL) {
                        handToUse = 'R';
                    } else { // 거리가 같을 경우
                        handToUse = (hand.equals("right")) ? 'R' : 'L';
                    }
                    break;
            }

            if(handToUse == 'L') {
                nowL = number;
                answer.append("L");
            } else {
                nowR = number;
                answer.append("R");
            }
        }

        return answer.toString();
    }

    // 두 키패드 위치 간의 거리를 계산하는 메소드
    private int getDistance(int now, int number, Map<Integer, Integer> map) {
        int x = map.get(now);
        int y = map.get(number);
        return Math.abs(x / 10 - y / 10) + Math.abs(x % 10 - y % 10);
    }
}

💡풀이 2

- 개선된 switch문 사용해보기

import java.util.HashMap;
import java.util.Map;

class Solution {
    public String solution(int[] numbers, String hand) {
        StringBuilder answer = new StringBuilder();
        Map<Integer, Integer> map = new HashMap<>();

        for(int i = 1; i < 10; i++) {
            int row = (i - 1) / 3;
            int col = (i - 1) % 3;
            map.put(i, row * 10 + col);
        }
        map.put(0, 31);   // 0의 좌표
        map.put(11, 30);  // *의 좌표
        map.put(12, 32);  // #의 좌표

        int nowL = 11;
        int nowR = 12;

        for(int number : numbers) {
            char handToUse = switch(number) {
                case 1, 4, 7 -> 'L';
                case 3, 6, 9 -> 'R';
                default -> {
                    int rangeL = getDistance(nowL, number, map);
                    int rangeR = getDistance(nowR, number, map);

                    if(rangeL < rangeR) {
                        yield 'L';
                    } else if(rangeR < rangeL) {
                        yield 'R';
                    } else {
                        yield (hand.equals("right")) ? 'R' : 'L';
                    }
                }
            };

            if (handToUse == 'L') {
                nowL = number;
                answer.append('L');
            } else {
                nowR = number;
                answer.append('R');
            }
        }

        return answer.toString();
    }

    // 두 키패드 위치 간의 거리를 계산하는 메소드
    private int getDistance(int now, int number, Map<Integer, Integer> map) {
        int x = map.get(now);
        int y = map.get(number);
        return Math.abs(x / 10 - y / 10) + Math.abs(x % 10 - y % 10);
    }
}

📖새로 배운 부분

- JAVA switch 문에 대해 글로 정리하고 최신 문법까지 학습해 보았습니다 😊

 

[Java] switch 문 최신 문법까지 정리해보기 (Java 14+)

Java의 switch 문은 특정 변수의 값에 따라 다른 코드를 실행할 때if-else 문보다 코드를 훨씬 깔끔하게 만들어주는 제어문입니다.Java 버전이 올라가면서 switch는 더 안전하고 강력하게 발전했습니다.

devoks.tistory.com


 

GitHub - okjunghyeon/Programmers_CodingTest: 프로그래머스 관련 코딩테스트 문제를 풀이한 저장소입니다.

프로그래머스 관련 코딩테스트 문제를 풀이한 저장소입니다. Contribute to okjunghyeon/Programmers_CodingTest development by creating an account on GitHub.

github.com

'CodingTest > Programmers' 카테고리의 다른 글

[프로그래머스, Java] 신규 아이디 추천  (0) 2025.07.29
[프로그래머스, Java] 성격 유형 검사하기  (0) 2025.07.21
[프로그래머스, Java][PCCE 기출문제] 10번 / 데이터 분석  (0) 2025.07.21
[프로그래머스, Java] 크레인 인형뽑기 게임  (0) 2025.07.21
[프로그래머스, Java] 햄버거 만들기  (0) 2025.07.21
'CodingTest/Programmers' 카테고리의 다른 글
  • [프로그래머스, Java] 신규 아이디 추천
  • [프로그래머스, Java] 성격 유형 검사하기
  • [프로그래머스, Java][PCCE 기출문제] 10번 / 데이터 분석
  • [프로그래머스, Java] 크레인 인형뽑기 게임
devoks
devoks
꾸준히 작성해보자!
  • devoks
    ok's 개발 블로그
    devoks
  • 전체
    오늘
    어제
    • 분류 전체보기 (112) N
      • Backend (15)
        • SpringBoot (0)
        • Java (15)
      • Cs (18) N
      • Infra (0)
        • AWS (0)
        • Docker (0)
      • CodingTest (79)
        • Programmers (79)
  • 링크

    • My GitHub
  • 인기 글

  • 태그

    java
    codingtest
    json
    CS
    programmers
    StringTokenizer
    effectivejava
    BufferedWriter
    switch
    BufferedReader
  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
devoks
[프로그래머스, Java][카카오 인턴] 키패드 누르기
상단으로

티스토리툴바