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
개인적으로 level1은 아니었던 것 같다.
사실 문제의 풀이법은 금방 찾았지만... 다른 부분에서 엄청난 시간을 해매고 풀었다 ㅠ
그리고 각각 계산식마다 메소드를 분리해서 만들어주는 일종의 모듈화에 신경을 많이 쓰다보니 느려진 것도 있었다.
어쨌든 점점 개발자의 마인드?? 로서 풀이하려는 노력을 해나가는 중이다.
카카오 인턴십 문제라는데... 휴 여기 갈라면 아직 멀었다.
[알고리즘 Flow]
1. 키패드를 2차원 배열로 가정하여 각각의 숫자마다의 좌표를 2차원 배열 값으로 넣는다. {0, 0}, {0, 1}... 이런식으로
2. 왼쪽, 오른쪽 손가락을 변수 선언하여 초기화한다.
3. 우선 1,4,7,3,6,9 일때는 누르는 손가락이 정해져있으니 바로 해당 손가락을 answer에 추가하고 누른 손가락의 숫자를 해당 변수에 담아둔다.
4. 2,5,8,0 일때는 해당 숫자와 왼쪽, 오른쪽 손가락과의 거리를 각각 구하여 낮은 값의 손가락값을 answer에 추가해준다.
[결과코드]
import java.lang.Math;
class Solution {
public String solution(int[] numbers, String hand) {
String answer = "";
// 우선 왼쪽 손가락과 오른쪽 손가락을 변수 선언한다.
int left = 10; // == *
int right = 11; // == #
for (int i = 0; i < numbers.length; i++) {
// 1, 4, 7, 3, 6, 9 일때 그냥 넣어버리기
switch (numbers[i]) {
case 1:
case 4:
case 7:
answer += "L";
left = numbers[i];
break;
case 3:
case 6:
case 9:
answer += "R";
right = numbers[i];
break;
case 0:
case 2:
case 5:
case 8:
// 0,2,5,8일때는 각각의 거리를 구해서, 가까운 쪽의 손가락을 리턴한다.
if (getHands(left, right, numbers[i], hand).equals("L")) {
answer += "L";
left = numbers[i];
break;
} else {
answer += "R";
right = numbers[i];
break;
}
}
}
return answer;
}
public static String getHands(int left, int right, int number, String hand) {
// 각 숫자마다의 위치를 배열로 담아준다.
int[][] keyPad = {
{3, 1},
{0, 0},
{0, 1},
{0, 2},
{1, 0},
{1, 1},
{1, 2},
{2, 0},
{2, 1},
{2, 2},
{3, 0},
{3, 2}
};
// 주어진 숫자와 손가락의 위치의 각각의 값중 큰값 - 작은 값을 해준 값을 더해준다.
int leftDistance =
getDistance(keyPad[left][0], keyPad[number][0]) + getDistance(keyPad[left][1], keyPad[number][1]);
int rightDistance =
getDistance(keyPad[right][0], keyPad[number][0]) + getDistance(keyPad[right][1], keyPad[number][1]);
// 해당 값을 비교하여 작은 값을 리턴하고, 같은 값이면 hand를 비교하여 리턴한다.
if (leftDistance < rightDistance) {
return "L";
} else if (leftDistance > rightDistance) {
return "R";
} else {
if (hand.equals("left")) {
return "L";
} else {
return "R";
}
}
}
public static int getDistance (int a, int b) {
// 절대값을 구하는 메소드 (직접 구현해봤다.)
if (a < b) {
return b - a;
} else if (a > b) {
return a - b;
} else {
return a - b;
}
}
}
hand == "left" 이런식으로 코드를 짰더니 계속 에러가 발생하는 것이었다.
예전에 equals를 쓰는게 좋다고 그렇게 많이 들었는데 ㅠㅠ 후...항상 작은 것에서 실수하기 마련이다.
어쨌든 알고리즘 자체는 금방 풀었다.
오늘도 해결!
[깃허브]
https://github.com/RUCKUSJERRY/practiceOfJava/blob/main/Prs_Pratice/src/com/level01/keyPad.java
RUCKUSJERRY/practiceOfJava
Contribute to RUCKUSJERRY/practiceOfJava development by creating an account on GitHub.
github.com
'문제풀이 > 프로그래머스' 카테고리의 다른 글
[1차] 비밀지도 / 프로그래머스 연습문제 / programmers / level1 / Java (0) | 2021.06.09 |
---|---|
폰켓몬 / 프로그래머스 연습문제 / programmers / level1 / Java (0) | 2021.06.08 |
실패율 / 프로그래머스 연습문제 / programmers / level1 / javascript (0) | 2021.05.15 |
큰 수 만들기 / 프로그래머스 연습문제 / programmers / level2 / Javascript / 탐욕 (0) | 2021.05.14 |
더 맵게 / 프로그래머스 연습문제 / programmers / level2 / java / 힙 (0) | 2021.05.13 |