[프로그래머스] [카카오 인턴] 키패드 누르기(67256)

lhs's avatar
Jan 01, 2025
[프로그래머스] [카카오 인턴] 키패드 누르기(67256)
 

1. 문제 풀이 아이디어

  • 손가락의 위치와 입력할 값 간의 거리를 계산하여 문제를 해결한다.

2. 나의 정답 코드

class Solution { StringBuilder stringBuilder = new StringBuilder(); int n; int l = 10; int r = 12; public String solution(int[] numbers, String hand) { for (int i = 0; i < numbers.length; i++) { n = numbers[i] == 0 ? 11 : numbers[i]; if (n == 1 || n == 4 || n == 7) { addL(); } else if (n == 3 || n == 6 || n == 9) { addR(); } else { int ld = dist(l, n); int rd = dist(r, n); if (ld == rd) { if (hand.charAt(0) == 'l') { addL(); } else { addR(); } } else if (ld < rd) { addL(); } else { addR(); } } } return stringBuilder.toString(); } private void addL() { stringBuilder.append('L'); l = n; } private void addR() { stringBuilder.append('R'); r = n; } private int dist(int a, int b) { int ax = (a - 1) % 3 + 1; int ay = (a - 1) / 3; int bx = (b - 1) % 3 + 1; int by = (b - 1) / 3; return Math.abs(ax - bx) + Math.abs(ay - by); } }

3. 정리

  • 손가락의 위치를 정수로 저장하며, , 0, #의 경우 각각 10, 11, 12로 설정하여 계산한다.
  • 입력값이 1, 4, 7일 때와 3, 6, 9일 때는 결과값에 각각 'L'과 'R'을 바로 추가한다.
  • 그 외의 경우 dist 메서드를 사용해 좌우 손가락의 거리를 계산한 후 값을 비교해 'L' 또는 'R'을 추가하여 문제를 해결한다.

4. 다른 사람의 코드 리뷰

class Solution { // 0부터 9까지 좌표 {y,x} int[][] numpadPos = { {3,1}, //0 {0,0}, //1 {0,1}, //2 {0,2}, //3 {1,0}, //4 {1,1}, //5 {1,2}, //6 {2,0}, //7 {2,1}, //8 {2,2} //9 }; //초기 위치 int[] leftPos = {3,0}; int[] rightPos = {3,2}; String hand; public String solution(int[] numbers, String hand) { this.hand = (hand.equals("right")) ? "R" : "L"; String answer = ""; for (int num : numbers) { String Umji = pushNumber(num); answer += Umji; if(Umji.equals("L")) {leftPos = numpadPos[num]; continue;} if(Umji.equals("R")) {rightPos = numpadPos[num]; continue;} } return answer; } //num버튼을 누를 때 어디 손을 사용하는가 private String pushNumber(int num) { if(num==1 || num==4 || num==7) return "L"; if(num==3 || num==6 || num==9) return "R"; // 2,5,8,0 일때 어디 손가락이 가까운가 if(getDist(leftPos, num) > getDist(rightPos, num)) return "R"; if(getDist(leftPos, num) < getDist(rightPos, num)) return "L"; //같으면 손잡이 return this.hand; } //해당 위치와 번호 위치의 거리 private int getDist(int[] pos, int num) { return Math.abs(pos[0]-numpadPos[num][0]) + Math.abs(pos[1]-numpadPos[num][1]); } }
  • numpadPos로 키패드 좌표를 명시해 가독성과 유지보수성이 뛰어나다.
  • 좌표를 미리 정의해 연산 비용을 줄였으므로 성능도 더 효율적이다.
Share article

LHS's Study Space