프로그래머스 키패드 누르기 [Java]
문제출처
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
3가지로 나눠서 풀어야겠다고 생각했다.
-1, 4, 7 => 무조건 왼손
-3, 6, 9 => 무조건 오른선
-2, 5, 8, 0 => 거리 측정
*, 0, #은 각각 10, 11, 12로 바꿔서 생각함
길이는 왼손이 있을 수 있는 위치 1, 4, 7, 11과 2, 5, 8, 0으로 나누어서 생각했다. 오른손도 마찬가지
1, 4, 7, 11일때는 가운데로 한칸 이동한다고 가정한 후 가운데에서 2, 5, 8, 0까지의 위치를 계산
오른손의 경우에도 마찬가지로 계산 후 각각 거리를 구한다.
거리끼리 비교 후 할일을 해주면 끝
class Solution {
public String solution(int[] numbers, String hand) {
String answer = "";
int now_left = 10, now_right = 12;
for(int n : numbers){
if(n == 0) {n = 11;}
if(n == 1 || n == 4 || n == 7){
answer += "L";
now_left = n;
}
else if(n == 3 || n == 6 || n == 9){
answer += "R";
now_right = n;
}
else{
int left_d, right_d;
if(now_left == 1 || now_left == 4 || now_left == 7 || now_left == 10){
if(Math.abs(now_left - n) == 1){
left_d = 1;
}
else{
left_d = Math.abs((now_left + 1) - n) / 3 + 1;
}
}
else{
left_d = Math.abs(now_left - n) / 3;
}
if(now_right == 3 || now_right == 6 || now_right == 9 || now_right == 12){
if(Math.abs(now_right - n) == 1){
right_d = 1;
}
else{
right_d = Math.abs((now_right - 1) - n) / 3 + 1;
}
}
else{
right_d = Math.abs(now_right - n) / 3;
}
if(left_d == right_d){
if(hand.equals("left")){
answer += "L";
now_left = n;
}
else{
answer += "R";
now_right = n;
}
}
else{
if(left_d < right_d){
answer += "L";
now_left = n;
}
else{
answer += "R";
now_right = n;
}
}
}
}
return answer;
}
}
다른 풀이를 보니 좌표 형식으로 푸는 방법도 있고, 나랑 비슷한 방법도 있고 뭐가 더 좋은 풀이인지 아직 판별하기 어렵다... 오늘은 우선 여기서 끝
'문제풀이 > 코딩테스트' 카테고리의 다른 글
프로그래머스 소수 만들기 [Java] (0) | 2022.02.20 |
---|---|
프로그래머스 크레인 인형뽑기 게임 [Java] (0) | 2022.02.18 |
프로그래머스 숫자 문자열과 영단어 [Java] (0) | 2022.02.14 |
프로그래머스 신규 아이디 추천 [Java] (0) | 2022.02.13 |
프로그래머스 신고 결과 받기 [Java] (0) | 2022.02.11 |