1. 문제링크
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
2. 접근방법
숫자 패드를 1차원 배열
{0, 0}, {0, 1}, {0, 2}, {1, 0}......{3, 2}로 만들어서 차이의 절대값을 계산하여 가까운 위치를 찾아주었다.
3. 코드
class Solution {
public String solution(int[] numbers, String hand) {
String answer = "";
int phone[][] = {{},{0, 0}, {0, 1}, {0, 2},
{1, 0}, {1, 1}, {1, 2},
{2, 0}, {2, 1}, {2, 2},
{3, 0}, {3, 1}, {3, 2}};
int lastL[] = {3, 0};
int lastR[] = {3, 2};
for (int i = 0; i < numbers.length; i++) {
if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7) {
answer += "L";
if(numbers[i] == 1)
lastL = phone[1];
if(numbers[i] == 4)
lastL = phone[4];
if(numbers[i] == 7)
lastL = phone[7];
}
else if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9) {
answer += "R";
if(numbers[i] == 3)
lastR = phone[3];
if(numbers[i] == 6)
lastR = phone[6];
if(numbers[i] == 9)
lastR = phone[9];
}
else {
int temp[] = null;
if( numbers[i] == 2 )
temp = phone[2];
else if( numbers[i] == 5 )
temp = phone[5];
else if( numbers[i] == 8 )
temp = phone[8];
else if( numbers[i] == 0 )
temp = phone[11];
int distL = Math.abs(lastL[0] - temp[0]) + Math.abs(lastL[1] - temp[1]);
int distR = Math.abs(lastR[0] - temp[0]) + Math.abs(lastR[1] - temp[1]);
System.out.println(numbers[i] + " " + distL + " " + distR);
if(distL > distR) {
lastR = temp;
answer += "R";
} else if(distL < distR) {
lastL = temp;
answer += "L";
} else {
if(hand.equals("left")) {
answer += "L";
lastL = temp;
} else {
answer += "R";
lastR = temp;
}
}
}
}
return answer;
}
}
4. 마치며
코드를 조금 더 꼼꼼하게 보아야 겠다....
answer += 해준 이후에 나머지 코드들을 자세하게 보지 않아 시간이 조금 더 걸렸다.
시뮬레이션은 항상 꼼꼼하게 봐주기!
'알고리즘' 카테고리의 다른 글
프로그래머스 : K번째수 (Javascript) (0) | 2021.05.11 |
---|---|
프로그래머스 : 모의고사 (Javascript) (0) | 2021.05.09 |
백준 1976 : 여행가자 (Java) (0) | 2020.10.27 |
백준 10844 : 쉬운 계단 수 (Java) (0) | 2020.10.27 |
백준 14500 : 테트로미노 (Java) (0) | 2020.10.18 |