728x90
코딩 테스트 풀이 체크리스트 |
|
2시간 내에 풀었는가? | O |
본인의 실력으로 풀었는가? | X |
코딩테스트 연습 - 키패드 누르기
[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
class Solution {
public String solution(int[] numbers, String hand) {
StringBuilder answer = new StringBuilder();
String[] keypad = {"l", "m", "r", "l", "m", "r", "l", "m", "r", "l", "m", "r"};
int left = 9;
int right = 11;
for (int i = 0; i < numbers.length; i++) {
if (numbers[i] == 0) {
numbers[i] = 10;
} else {
numbers[i]--;
}
}
for (int i = 0; i < numbers.length; i++) {
int num = numbers[i];
if (keypad[num].equals("l")) {
left = num;
answer.append("L");
} else if (keypad[num].equals("r")) {
right = num;
answer.append("R");
} else {
int temp = func(num, left, right);
if (temp == 1) {
left = num;
answer.append("L");
} else if (temp == -1) {
right = num;
answer.append("R");
} else {
if (hand.equals("left")) {
left = num;
answer.append("L");
} else {
right = num;
answer.append("R");
}
}
}
}
return answer.toString();
}
public int func(int number, int left, int right) {
int num = number;
int l1 = (left) / 3;
int m1 = (num) / 3;
int r1 = (right) / 3;
int l2 = (left) % 3;
int m2 = (num) % 3;
int r2 = (right) % 3;
double lFar = Math.abs(l1 - m1) + Math.abs(l2 - m2);
double rFar = Math.abs(r1 - m1) + Math.abs(r2 - m2);
if (lFar < rFar) {
return 1;
} else if (lFar > rFar) {
return -1;
} else {
return 0;
}
}
}
테스트 1 〉 | 통과 (0.04ms, 76.1MB) |
테스트 2 〉 | 통과 (0.04ms, 73.5MB) |
테스트 3 〉 | 통과 (0.04ms, 77.1MB) |
테스트 4 〉 | 통과 (0.03ms, 72.4MB) |
테스트 5 〉 | 통과 (0.05ms, 73MB) |
테스트 6 〉 | 통과 (0.06ms, 77.1MB) |
테스트 7 〉 | 통과 (0.06ms, 67.6MB) |
테스트 8 〉 | 통과 (0.08ms, 76.1MB) |
테스트 9 〉 | 통과 (0.07ms, 80.2MB) |
테스트 10 〉 | 통과 (0.05ms, 71.8MB) |
테스트 11 〉 | 통과 (0.05ms, 72.4MB) |
테스트 12 〉 | 통과 (0.08ms, 68.8MB) |
테스트 13 〉 | 통과 (0.09ms, 64.8MB) |
테스트 14 〉 | 통과 (0.16ms, 84.4MB) |
테스트 15 〉 | 통과 (0.32ms, 75.3MB) |
테스트 16 〉 | 통과 (0.27ms, 76.2MB) |
테스트 17 〉 | 통과 (0.58ms, 73.8MB) |
테스트 18 〉 | 통과 (0.28ms, 78.9MB) |
테스트 19 〉 | 통과 (0.50ms, 87.1MB) |
테스트 20 〉 | 통과 (0.50ms, 72.5MB) |
도움을 받은 부분은 키패드의 거리 구할 때 유클리드 거리로 구했는데, 맨하탄 거리로 구해야 한다는 것을 알게 되었다..
좌표를 만들기 위해서 키패드 숫자에서 1씩 빼고, *은 9, 0은 10, #은 11로 만들어서 아래와 같은 표로 표현할 수 있다.
0 (실제 1) |
1 (실제 2) |
2 (실제 3) |
3 (실제 4) |
4 (실제 5) |
5 (실제 6) |
6 (실제 7) |
7 (실제 8) |
8 (실제 9) |
9 (실제 *) |
10 (실제 0) |
11 (실제 #) |
그래서 각각의 위치에 좌표를 구한다면 아래의 표와 같이 표현할 수 있는데,
x 좌표는 해당 위치의 숫자를 3으로 나눈 몫이고, y 좌표는 해당 위치의 숫자를 3으로 나눈 나머지이다.
0, 0 | 0, 1 | 0, 2 |
1, 0 | 1, 1 | 1, 2 |
2, 0 | 2, 1 | 2, 2 |
3, 0 | 3, 1 | 3, 2 |
그래서 좌표 (x1, y1), (x2, y2)의 맨하탄 거리를 구한다면 |x1 - x2| + |y1 - y2|이다.
처음엔 유클리드 거리로 해서 (x1-x2)^2 + (y1-y2)^2 로 했는데,
이렇게 하니까 테스트 13부터는 계속 오답이라고 떴다.
더보기
이전에 작성했던 코드
다른 풀이 참고해서 풀었던 기억이 있다
import java.util.*;
class Solution {
public String solution(int[] numbers, String hand) {
boolean value = true;
int l = 10;
int r = 12;
if (hand.equals("right")){
value = false;
}
ArrayList<String> data = new ArrayList<>();
for (int i = 0; i < numbers.length; i++){
int a = numbers[i];
if (a == 0) a = 11;
boolean value2 = true;
if (a == 1 || a == 4 || a == 7){
value2 = true;
} else if (a == 3 || a == 6 || a == 9){
value2 = false;
} else {
int ll = 0;
int rr = 0;
int l2 = l;
int r2 = r;
while (l2 != a){
if (l2 - a == -1 || l2 - a == 1){
ll++;
break;
}
if (l2 > a){
l2 -= 3;
ll++;
} else {
l2 += 3;
ll++;
}
}
while (r2 != a){
if (r2 - a == -1 || r2 - a == 1){
rr++;
break;
}
if (r2 > a){
r2 -= 3;
rr++;
} else {
r2 += 3;
rr++;
}
}
if (ll > rr) {
value2 = false;
} else if (ll < rr){
value2 = true;
} else {
value2 = value;
}
}
if (value2){
data.add("L");
l = a;
} else {
data.add("R");
r = a;
}
}
return String.join("", data);
}
}
테스트 1 〉 | 통과 (0.09ms, 52.1MB) |
테스트 2 〉 | 통과 (0.08ms, 51.8MB) |
테스트 3 〉 | 통과 (0.07ms, 52.4MB) |
테스트 4 〉 | 통과 (0.08ms, 53.2MB) |
테스트 5 〉 | 통과 (0.09ms, 51.8MB) |
테스트 6 〉 | 통과 (0.09ms, 53.1MB) |
테스트 7 〉 | 통과 (0.12ms, 52.8MB) |
테스트 8 〉 | 통과 (0.14ms, 53.9MB) |
테스트 9 〉 | 통과 (0.16ms, 53.6MB) |
테스트 10 〉 | 통과 (0.17ms, 52MB) |
테스트 11 〉 | 통과 (0.25ms, 52.1MB) |
테스트 12 〉 | 통과 (0.20ms, 53.1MB) |
테스트 13 〉 | 통과 (0.32ms, 52.2MB) |
테스트 14 〉 | 통과 (1.35ms, 51.7MB) |
테스트 15 〉 | 통과 (1.22ms, 52.6MB) |
테스트 16 〉 | 통과 (1.32ms, 53.4MB) |
테스트 17 〉 | 통과 (2.36ms, 52.5MB) |
테스트 18 〉 | 통과 (2.41ms, 52.4MB) |
테스트 19 〉 | 통과 (2.58ms, 52.6MB) |
테스트 20 〉 | 통과 (2.56ms, 52.1MB) |
String으로 L, R을 더해서 시간은 조금 더 걸리는 듯하다.
728x90
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[Java] 프로그래머스 - 크레인 인형뽑기 게임 (1단계) (0) | 2022.03.30 |
---|---|
[kotlin] 프로그래머스 - 행렬의 덧셈 (1단계) (0) | 2022.03.29 |
[kotlin] 프로그래머스 - x만큼 간격이 있는 n개의 숫자 (1단계) (0) | 2022.03.28 |
[Java] 프로그래머스 - 숫자 문자열과 영단어 (1단계) (0) | 2022.03.28 |
[kotlin] 프로그래머스 - 직사각형 별찍기 (1단계) (0) | 2022.03.25 |