67256번
코딩테스트 연습 - 키패드 누르기 | 프로그래머스 스쿨 (programmers.co.kr)
풀이
📌키패드의 위치 중 left, mid, right를 기준으로 행의 위치를 알고 있으면 답을 구하기 쉬워요.
예를 들어 키패드를 그대로 행의 인덱스 값을 부여하면 아래와 같습니다.
0 0 0
1 1 1
2 2 2
3 3 3
📌거리 계산이 핵심인데, 거리 계산을 하기 위해서는 손가락의 위치를 먼저 알아야 해요.
그래서 3개의 핵심이 있는 것 같아요.
🎈누르려는 엄지의 방향 (L / R)
🎈누르려는 키의 위치
🎈각 엄지와 키의 거리 계산
📝풀이1
public String solution(int[] numbers, String hand) {
StringBuilder sb = new StringBuilder();
hand = hand.equals("left") ? "L" : "R";
// 0 ... 9 행 번호
int[] rowKey = { 3, 0, 0, 0, 1, 1, 1, 2, 2, 2 };
Thumb thumb_l = new Thumb("L", 3); // 왼손
Thumb thumb_r = new Thumb("R", 3); // 오른손
for (int number : numbers) {
int row = rowKey[number]; // 행 번호
String[] pressWithThumb = new String[2]; // [0]=누르는 엄지, [1]=키의 위치
switch(number) {
case 1: case 4: case 7:
pressWithThumb[0] = "L"; pressWithThumb[1] = "L";
break;
case 3: case 6: case 9:
pressWithThumb[0] = "R"; pressWithThumb[1] = "R";
break;
default:
int dist = thumb_l.getMidDist(row) - thumb_r.getMidDist(row); // 거리 계산
pressWithThumb[0] = (dist == 0) ? hand : ( (dist < 0) ? "L" : "R" );
pressWithThumb[1] = "M";
break;
}
sb.append(pressWithThumb[0]);
if(pressWithThumb[0].equals("L")) thumb_l.setThumb(pressWithThumb[1], row);
else thumb_r.setThumb(pressWithThumb[1], row);
}
return sb.toString();
}
public class Thumb {
String position; // 엄지의 위치
int row;
public Thumb(String position, int row) {
this.position = position;
this.row = row;
}
private void setThumb(String position, int row) {
this.position = position;
this.row = row;
}
private int getMidDist(int mid) {
return Math.abs(mid - this.row) - (this.position.equals("M") ? 1 : 0);
}
}
먼저 Thumb 클래스를 봐야 되겠네요.
🔨getMidDist(int mid)
현재 엄지의 위치와 눌러야하는 키의 위치 사이의 거리를 계산합니다.
예를 들어볼게요.
눌러야 하는 키 : 5
왼손 엄지의 위치 : 7, 오른손 엄지의 위치 : 2
5의 행번호는 1
왼손 7의 행번호는 2으로 ➡ abs(1-2) = 1
오른손 2의 행번호는 0으로 ➡ abs(1-0) - 1 = 0
오른손의 경우 '2'는 중앙에 있는 키이므로 더 가깝기 때문에 -1 을 해야 합니다.
🔨int[] rowKey = { 3, 0, 0, 0, 1, 1, 1, 2, 2, 2 };
0부터 9까지의 행번호를 배열로 만들었어요.
행번호를 가지고 메소드 getMidDist()를 활용해 거리계산을 할 수 있어요.
🔨String[] pressWithThumb
String배열을 하나 만들었는데, 크기는 2로 고정이고
인덱스 0에는 어떤 엄지 손가락으로 누를 건지 ("L", "R") 중 하나를 저장합니다.
인덱스 1에는 누르려는 키의 위치가 어디에 있는지 ("L", "M", "R") 중 하나를 저장합니다.
⚡테스트 케이스 처리속도: 0.18ms ~ 0.78ms
'Algorithm > Java' 카테고리의 다른 글
프로그래머스 - 신고 결과 받기 java :: 2022 KAKAO BLIND RECRUITMENT (0) | 2022.07.09 |
---|---|
프로그래머스 - 숫자 문자열과 영단어 java :: 2021 카카오 채용연계형 인턴십 (0) | 2022.07.08 |
프로그래머스 - 신규 아이디 추천 java :: 2021 KAKAO BLIND RECRUITMENT :: 72410 (0) | 2022.07.08 |
프로그래머스 - 크레인 인형뽑기 게임 java :: 2019 카카오 개발자 겨울 인턴십 :: 64061 (0) | 2022.07.07 |
프로그래머스 - 없는 숫자 더하기 java :: 월간 코드 챌린지 시즌3 (0) | 2022.07.06 |