[프로그래머스/Lv. 1] 키패드 누르기
🔺 문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
🔺 코드
[프로그래머스] 키패드 누르기 - Java, 자바
레벨 1https://programmers.co.kr/learn/courses/30/lessons/67256현재 왼손과 오른손의 위치를 키패드를 누를 때 마다 기억하고 있어야하는 부분을 구현하기 까다로운 문제였다. 키패드 위아래로 3차이, 양옆으
velog.io
class Solution {
public String solution(int[] numbers, String hand) {
String answer = "";
int left = 10;
int right = 12;
for(int tmp : numbers) {
if(tmp == 1 || tmp == 4 || tmp == 7) {
answer += "L";
left = tmp;
} else if(tmp == 3 || tmp == 6 || tmp == 9) {
answer += "R";
right = tmp;
} else { // 2 5 8 0
if(tmp == 0) tmp = 11;
int leftD = Math.abs(tmp - left) / 3 + Math.abs(tmp - left) % 3;
int rightD = Math.abs(tmp - right) / 3 + Math.abs(tmp - right) % 3;
if(leftD < rightD) {
answer += "L";
left = tmp;
} else if(leftD > rightD) {
answer += "R";
right = tmp;
} else {
if(hand.equals("left")) {
answer += "L";
left = tmp;
} else {
answer += "R";
right = tmp;
}
}
}
}
return answer;
}
}
✅ 해결 아이디어
- 각 핸드폰 번호 사이의 거리를 좌표를 기준으로 생각
🔺 다른 풀이들
- 풀이1)
프로그래머스[Java] - 키패드 누르기(2020 카카오 인턴십)
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"
zzang9ha.tistory.com
프로그래머스) 키패드 누르기 (JAVA)
문제 설명 스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다. 이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다. 맨 처음 왼손 엄
kangsd.tistory.com
설명을 잘 해주셨다.... 굿!!!
- 풀이2) switch - case 사용
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
class Solution {
int tempL = 10;
int tempR = 12;
String myhand;
public String solution(int[] numbers, String hand) {
myhand = ((hand.equals("right"))? "R": "L");
String answer = "";
for(int i=0 ; i< numbers.length ; i++) {
switch(numbers[i]) {
case 1: case 4: case 7:
answer += "L";
tempL = numbers[i];
break;
case 3: case 6: case 9:
answer += "R";
tempR = numbers[i];
break;
default:
String tempHand = checkHand(numbers[i]);
if(tempHand.equals("R"))
tempR = numbers[i] + ((numbers[i] == 0)? 11:0);
else tempL = numbers[i] + ((numbers[i] == 0)? 11:0);
answer += tempHand;
break;
}
}
return answer;
}
private String checkHand(int tempNum) {
int leftDistance = 0;
int rightDistance = 0;
if(tempNum == 0) tempNum = 11;
leftDistance = Math.abs((tempNum-1)/3 - (tempL-1)/3) + Math.abs((tempNum-1)%3 - (tempL-1)%3);
rightDistance = Math.abs((tempNum-1)/3 - (tempR-1)/3) + Math.abs((tempNum-1)%3 - (tempR-1)%3);
System.out.println(tempNum + ": " + leftDistance + ", " + rightDistance);
return ((leftDistance == rightDistance)? myhand: (leftDistance > rightDistance)? "R": "L");
}
}
💬 느낀 점
저 /3, %3 규칙을 나는 파악하지 못 해서 해결하지 못했다..
이런 규칙이 얼른 눈에 잘 보이면 좋겠다!!