알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄
https://school.programmers.co.kr/learn/courses/30/lessons/67256
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
Think🤔
지문이 기므로 문제 파악을 정확히 해야된다!
package kcue.test;
public class pushKeypad {
public static void main(String[] args) {
int numbers[] = {1,3,4,5,8,2,1,4,5,9,5}; String hand = "right"; // result : "LRLLLRLLRRL"
//int numbers[] = {7,0,8,2,8,3,1,5,7,6,2}; String hand = "left"; // result : "LRLLRRLLLRR"
//int numbers[] = {1,2,3,4,5,6,7,8,9,0}; String hand = "right"; // result : "LLRLLRLLRL"
String answer = "";
int nowLeft = 10;
int nowRight = 12; // 현재 위치
for(int i=0; i<numbers.length; i++) {
if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7) {
answer += "L";
continue;
}else if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9){
answer += "R";
continue;
}else {
numbers[i] = (numbers[i] == 0 ) ? 11 : numbers[i];
answer += calCulate(nowLeft,nowRight,numbers[i],hand);
}
}
System.out.println(answer);
}
// 거리 계산
public static String calCulate(int left , int right , int point , String hand) { // main에서 실행 하기 위해 static에 메소드 올려줌
int leftD = 0,rightD = 0; // D : Distance(거리)
if(point == left + 1 || point == left - 1) { // 좌우일 경우 거리 1
leftD++;
}else {
leftD = (point / left) + ((point % left < 3) ? 1 : 0);
}
if(point == right + 1 || point == right - 1) {
rightD++;
}else {
rightD = (point / right) + ((point % right < 3) ? 1 : 0);
}
if(leftD > rightD) {
// nowLeft = point;
return "L";
}else if(leftD < rightD) {
// nowRight = point;
return "R";
}else
// point 가 left면 nowLeft = point;
// point 가 right면 nowRight = point;
return String.valueOf(hand.charAt(0));
}
}
package kcue.test;
public class pushKeypad2 {
public static void main(String[] args) {
int numbers[] = {1,3,4,5,8,2,1,4,5,9,5}; String hand = "right"; // result : "LRLLLRLLRRL"
//int numbers[] = {7,0,8,2,8,3,1,5,7,6,2}; String hand = "left"; // result : "LRLLRRLLLRR"
//int numbers[] = {1,2,3,4,5,6,7,8,9,0}; String hand = "right"; // result : "LLRLLRLLRL"
String answer = "";
int nowLeft = 10;
int nowRight = 12; // 현재 위치
// 4 5 8
for(int i=0; i<numbers.length; i++) {
System.out.println("numbers[i] : " + numbers[i]);
if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7) {
answer += "L";
nowLeft = numbers[i];
continue;
}else if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9){
answer += "R";
nowRight = numbers[i];
continue;
}else {
numbers[i] = (numbers[i] == 0 ) ? 11 : numbers[i];
// 계산
int leftD = 0,rightD = 0; // D : Distance(거리)
if(numbers[i] == nowLeft + 1 || numbers[i] == nowLeft - 1) { // 좌우일 경우 거리 1
leftD++;
}else if(numbers[i] == nowLeft + 3 || numbers[i] == nowLeft - 3) { // 위아래 경우 거리 1
leftD++;
}else {
leftD = (numbers[i] / nowLeft) + ((numbers[i] % nowLeft < 3) ? 1 : 0);
}
if(numbers[i] == nowRight + 1 || numbers[i] == nowRight - 1) {
rightD++;
}else if(numbers[i] == nowRight + 3 || numbers[i] == nowRight - 3) { // 위아래 경우 거리 1
rightD++;
}else {
rightD = (numbers[i] / nowRight) + ((numbers[i] % nowRight < 3) ? 1 : 0);
}
if(leftD == 0) {
answer += "R";
continue;
}else if(rightD == 0){
answer += "L";
continue;
}else {
}
if(leftD < rightD) {
nowLeft = numbers[i];
answer += "L";
}else if(leftD > rightD) {
nowRight = numbers[i];
answer += "R";
}else{
if(hand.equals("left")){
nowLeft = numbers[i];
}else{
nowRight = numbers[i];
}
answer += String.valueOf(hand.charAt(0)).toUpperCase();
}
}
}
System.out.println(answer);
}
}
규칙을 찾아서 일단 if else로 만들었으나... 잘못 푼 듯했는데!!
다른 풀이 보니깐 정말 비슷한 코드가 있으므로 중간에 거리 계산해주는 부분을 리팩터링 할 필요가 있다!
거리 구하는 부분을 수정할 필요가 있음
중복되는 코드가 있으므로 메서드를 생성
Solution✍
노트에 먼저
1 2 3
4 5 6
7 8 9
* 0 #
을 노트에 그리고.. 문제에서 주어지는 배열은 다 숫자이기 때문에 키패드에서 문자를 누를 일이 없으므로 , 처음 값에 대입
숫자를 순서대로 대입하고 0이나오면 중간 값인 11로 변환시킨다!
package kcue.test;
public class pushKeypad2 {
public static void main(String[] args) {
int numbers[] = { 1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5 };
String hand = "right"; // result : "LRLLLRLLRRL"
// int numbers[] = {7,0,8,2,8,3,1,5,7,6,2}; String hand = "left"; // result : "LRLLRRLLLRR"
// int numbers[] = {1,2,3,4,5,6,7,8,9,0}; String hand = "right";// result : "LLRLLRLLRL"
String answer = "";
int nowLeft = 10;
int nowRight = 12; // 현재 위치
int leftD = 0, rightD = 0;
// 4 5 8
for (int i = 0; i < numbers.length; i++) {
System.out.println("numbers[i] : " + numbers[i]);
if (numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7) {
answer += "L";
nowLeft = numbers[i];
continue;
} else if (numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9) {
answer += "R";
nowRight = numbers[i];
continue;
} else {
numbers[i] = (numbers[i] == 0) ? 11 : numbers[i]; // 0의 위치면 11
leftD = calCulate(nowLeft, numbers[i]);
rightD = calCulate(nowRight, numbers[i]);
if (leftD < rightD) {
nowLeft = numbers[i];
answer += "L";
} else if (leftD > rightD) {
nowRight = numbers[i];
answer += "R";
} else {
if (hand.equals("left")) {
nowLeft = numbers[i];
} else {
nowRight = numbers[i];
}
answer += String.valueOf(hand.charAt(0)).toUpperCase();
}
}
}
System.out.println(answer);
}
// 거리계산
public static int calCulate(int nowPoint, int num) {
int distance = 0;
distance = (Math.abs(num - nowPoint) / 3) + (Math.abs(num - nowPoint) % 3);
return distance;
}
}
Review🤩
거리 계산에 머리 써야 됨!
'Algorithm' 카테고리의 다른 글
[프로그래머스] 2022 KAKAO TECH INTERNSHIP성격 유형 검사하기 (0) | 2022.09.28 |
---|---|
[프로그래머스] 크레인 인형뽑기 게임 (1) | 2022.09.23 |
[프로그래머스] 음양 더하기 (0) | 2022.08.08 |
[프로그래머스] 없는 숫자 더하기 (0) | 2022.08.08 |
[프로그래머스] 내적 (0) | 2022.08.08 |