프로그래머스 2020 카카오 인턴십 키패드 누르기 JAVA 풀이
코딩테스트 연습 - 키패드 누르기
[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
프로그래머스 Level 1 문제로, 문제 자체는 어려운 편이 아니지만 예외 처리해야 하는 것들이 많아서 시간이 조금 걸릴 수 있는 문제다.
- 키패드는 순서대로 문제에 나와있는 사진과같이 1,2,3,4,5,6,7,8,9,*,0,# 순서로 있다.
- (1,4,7) 일때는 무조건 왼손을 사용하고, (3,6,9) 일때는 무조건 오른손을 사용하고, 현재 Left,Right의 위치를 갱신한다.
- 시작 위치는 왼손은 *(키패드 상으로 10번째) , 오른손은 #(키패드 상으로 12번째)
- 문제는 (2,5,8,0) 인데 여기서 규칙을 찾는것이 가장 중요하다.
->규칙 (키패드-1) / 3 은 X 좌표, (키패드-1) % 3 은 Y 좌표를 구할 수 있다.
5. 키패드 0은 11로 바꿔줘야한다. (0의 좌표는 (3,1))
6. 마지막으로, L또는 R이 위치한 좌표와 누르려는 키패드(n) 의 차이를 구한다
class Solution {
public String solution(int [] n, String hand) {
StringBuilder bd = new StringBuilder();
int leftLocation = 10;
int rightLocation = 12;
for(int number : n) {
if(number ==1 || number == 4 || number == 7) {
bd.append("L");
leftLocation = number;
}else if(number == 3 || number == 6 || number == 9) {
bd.append("R");
rightLocation = number;
}else { // 2 5 8 0
int distanceL = getDist(leftLocation, number);
int distanceR = getDist(rightLocation, number);
if(distanceL > distanceR) {
bd.append("R");
rightLocation = number;
}else if(distanceL < distanceR) {
bd.append("L");
leftLocation = number;
}else {
if(hand.equals("right")) {
bd.append("R");
rightLocation = number;
}else {
bd.append("L");
leftLocation = number;
}
}
}
}
return bd.toString();
}
public static int getDist(int location, int number) {
if(number == 0) {
number = 11;
}
if(location == 0) {
location = 11;
}
int locationX = (location-1) / 3;
int locationY = (location-1) % 3;
int numberX = (number-1) / 3;
int numberY = (number-1) % 3;
return Math.abs(locationX-numberX) + Math.abs(locationY - numberY);
}
}
'Algorithm by java' 카테고리의 다른 글
백준 1339번 단어수학 java (0) | 2020.10.23 |
---|---|
[프로그래머스] LV2 큰 수 만들기 (0) | 2020.10.14 |
프로그래머스 Level2 스킬트리 JAVA (0) | 2020.07.05 |
프로그래머스 2019 카카오 개발자 겨울 인턴십 크레인 인형뽑기 게임 JAVA (0) | 2020.07.02 |
[알고리즘] Missing Ranges (java 풀이) leetcode (0) | 2020.06.25 |