0. 사용 함수
- Math.abs(값) // 값을 절대 값으로 리턴함
1. 문제 내용
- 설명
기본적인 스마트폰 키패드를 생각하면 된다.
1 | 2 | 3 |
4 | 5 | 6 |
7 | 8 | 9 |
* | 0 | # |
왼손엄지는 *에서 출발, 오른손엄지는 #에서 출발해서
주어지는 숫자를 어떤 손의 엄지로 누르는 것이 가장 빠른지 계산하는 문제.
오른손, 왼손 중 어떤 엄지손가락으로 누를지 L 또는 R로 표기해 String 결과 값을 뽑아내면 된다.
만약 왼손 엄지에서의 거리와 오른손 엄지에서의 거리가 같은 경우에는
사용자가 오른손잡이라면 오른손, 왼손잡이라면 왼손을 사용하게 된다.
- 제한 사항
numbers 배열의 크기는 1 이상 1,000 이하입니다.
numbers 배열 원소의 값은 0 이상 9 이하인 정수입니다.
hand는 "left" 또는 "right" 입니다.
"left"는 왼손잡이, "right"는 오른손잡이를 의미합니다.
왼손 엄지손가락을 사용한 경우는 L, 오른손 엄지손가락을 사용한 경우는 R을 순서대로 이어붙여 문자열 형태로 return 해주세요.
2. 문제 풀이
import java.util.*;
class Solution {
public String solution(int[] numbers, String hand) {
int valueArr[][] = {{1,3},{0,0},{1,0},
{2,0},{0,1},{1,1},
{2,1},{0,2},{1,2},
{2,2},{0,3},{2,3}};
HashMap<Integer, int[]> keyPoint = new HashMap<>();
HashMap<String, int[]> hands = new HashMap<>();
hands.put("leftHand",valueArr[10]);
hands.put("rightHand",valueArr[11]);
for(int i=0; i < 10; i++){
keyPoint.put(i, valueArr[i]);
}
String answer = "";
for(int i : numbers){
switch(i){
case 1: case 4: case 7:
hands.put("leftHand",keyPoint.get(i));
answer += "L";
break;
case 2: case 5: case 8: case 0:
double lDist = calDistance(keyPoint.get(i),hands.get("leftHand"));
double rDist = calDistance(keyPoint.get(i),hands.get("rightHand"));
if(lDist<rDist){
hands.put("leftHand",keyPoint.get(i));
answer += "L";
} else if(lDist>rDist){
hands.put("rightHand",keyPoint.get(i));
answer += "R";
} else{
hands.put((hand.equals("right") ? "rightHand" : "leftHand"),keyPoint.get(i));
answer += hand.equals("right") ? "R" : "L";
}
break;
case 3: case 6: case 9:
hands.put("rightHand", keyPoint.get(i));
answer += "R";
break;
}
}
return answer;
}
public static double calDistance(int[] a1, int[] a2){
double distance = Math.abs(a2[0]-a1[0]) + Math.abs(a2[1]-a1[1]);
return distance;
}
}
3. 채점 결과
- 정확성 테스트
테스트 1 〉 | 통과 (2.38ms, 72.5MB) |
테스트 2 〉 | 통과 (1.75ms, 79.9MB) |
테스트 3 〉 | 통과 (1.75ms, 78MB) |
테스트 4 〉 | 통과 (2.50ms, 72MB) |
테스트 5 〉 | 통과 (1.96ms, 75.7MB) |
테스트 6 〉 | 통과 (2.07ms, 78.3MB) |
테스트 7 〉 | 통과 (2.92ms, 74.4MB) |
테스트 8 〉 | 통과 (2.38ms, 73MB) |
테스트 9 〉 | 통과 (2.07ms, 74.5MB) |
테스트 10 〉 | 통과 (2.18ms, 76.5MB) |
테스트 11 〉 | 통과 (2.07ms, 66.4MB) |
테스트 12 〉 | 통과 (2.13ms, 76.3MB) |
테스트 13 〉 | 통과 (2.23ms, 73.2MB) |
테스트 14 〉 | 통과 (2.34ms, 73.6MB) |
테스트 15 〉 | 통과 (3.01ms, 77.2MB) |
테스트 16 〉 | 통과 (3.01ms, 78MB) |
테스트 17 〉 | 통과 (3.60ms, 78.7MB) |
테스트 18 〉 | 통과 (3.03ms, 78.4MB) |
테스트 19 〉 | 통과 (3.55ms, 72.1MB) |
테스트 20 〉 | 통과 (3.63ms, 71MB) |
HashMap에 배열을 넣으려면 이미 생성된 배열을 집어넣어주어야 한다고 한다.
처음에는 냅다 때려 넣었다가 에러가 나서 찾아봤다ㅎㅎ..
나만 바보인가
나도 나름 깔끔하게 잘 풀었다 생각하고 뿌듯해 했는데
다른 사람들 문제 풀이를 보면 세상에는 똑똑한 사람들이 많드라,,
그리고 테스트 케이스 13~20번 에러나는 사람들을 위해 질문하기에 누가 글을 올려놨는데
나도 해당되는 사람이라 감사히 참고했다.
* 13~20번 에러는 피타고라스로 거리를 구해서 그렇다.
키패드에서 손가락은 사선으로 이동하지 않고, 상하좌우 한칸씩 이동하는 것을 전제로 한다.
'프로그래머스 > JAVA' 카테고리의 다른 글
008. 폰켓몬[JAVA] (0) | 2022.05.22 |
---|---|
007. 체육복[JAVA] (0) | 2022.05.21 |
006. 모의고사[JAVA] (0) | 2021.12.30 |
004. 소수 만들기[JAVA] (0) | 2021.12.23 |
001. 로또의 최고 순위와 최저 순위[JAVA] (0) | 2021.12.13 |