https://programmers.co.kr/learn/courses/30/lessons/67256
코딩테스트 연습 - 키패드 누르기
[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] "right" "LRLLLRLLRRL" [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] "left" "LRLLRRLLLRR" [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] "right" "LLRLLRLLRL"
programmers.co.kr
Lv1 문제이며, 주어진 순서대로 키패드를 움직일 때 왼손 오른손 패턴 순을 리턴하는 함수를 구현하는 문제입니다.
유의 사항으로 맨 처음 왼손, 오른손 엄지손가락 시작위치를 잘 설정해야 하고, 이 부분만 통과하면 무리 없이 통과 가능합니다.
구현 방법으로는 맨처음 왼손 엄지손가락 기준 0~9까지 초기 거리, 오른손 엄지손가락 기준 0~9까지 초기 거리, 0~9까지의 서로 간 거리를 배열로 미리 선언해서 거리를 비교하는 방식으로 구현하였고, 이럼에도 불구하고 손가락 거리가 같은 경우에는 왼손잡이 혹은 오른손잡이 여부를 체크해서 이동하도록 하였습니다. 이동할 때마다 손가락 인덱스를 체크하는 것 또한 필수입니다.
예제 코드는 다음과 같습니다.
public static String solution(int[] numbers, String hand) {
StringBuilder sb = new StringBuilder();
int leftIndex = -1;
int rightIndex = -1;
int[][] dis = {{0,4,3,4,3,2,3,2,1,2},{4,0,1,2,1,2,3,2,3,4},{3,1,0,1,2,1,2,3,2,3},
{4,2,1,0,3,2,1,4,3,2},{3,1,2,3,0,1,2,1,2,3},{2,2,1,2,1,0,1,2,1,2},{3,3,2,1,2,1,0,3,2,1},
{2,2,3,4,1,2,3,0,1,2},{1,3,2,3,2,1,2,1,0,1},{2,4,3,2,3,2,1,2,1,0}};
int[] leftDisArr = {1,3,4,5,2,3,4,1,2,3};
int[] rightDisArr = {1,5,4,3,4,3,2,3,2,1};
for (int num : numbers) {
if (num % 3 == 1) {
sb.append("L");
leftIndex = num;
} else if (num % 3 == 0 && num > 0) {
sb.append("R");
rightIndex = num;
} else {
int leftDis = leftIndex == -1 ? leftDisArr[num] : dis[leftIndex][num];
int rightDis = rightIndex == -1 ? rightDisArr[num] : dis[rightIndex][num];
if (leftDis < rightDis) {
sb.append("L");
leftIndex = num;
} else if (leftDis > rightDis) {
sb.append("R");
rightIndex = num;
} else {
sb.append("left".equals(hand) ? "L" : "R");
if ("left".equals(hand)) leftIndex = num;
else rightIndex = num;
}
}
}
return sb.toString();
}'코딩테스트' 카테고리의 다른 글
| [프로그래머스] 단체사진 찍기 (0) | 2022.05.01 |
|---|---|
| [프로그래머스] 추석 트래픽 (0) | 2022.04.25 |
| [프로그래머스] 베스트앨범 (0) | 2022.03.30 |
| [프로그래머스] 더 맵게 (0) | 2022.03.29 |
| [프로그래머스] 전화번호 목록 (0) | 2022.03.29 |