728x90
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
오늘 푼 문제중에 가장 복잡한 문제. 그래도 쉬웠다.
각 키패드 별로 해당하는 좌표를 맵으로 저장해 풀었다. 이차원 배열로 그냥 풀수도 있었을까, 싶긴 한데 숫자를 통해 좌표를 알아야 하기 때문에 나는 이 방식이 편했다. *과 #은 임의로 10, 11번으로 가정해 풀었다. (맵에 넣을 좌표가 필요했기 때문에)
가운데 있는 2, 5, 8, 0 키패드를 어느쪽 손가락으로 누를지 처리할 때는 현재에서 가야하는 곳까지의 |x좌표의 차이|+|y좌표의 차이| 로 계산하여 더 적은 쪽을 선택했다.
import java.awt.*;
import java.util.HashMap;
import java.util.Map;
public class keypad {
public static String solution(int[] numbers, String hand) {
String answer = "";
int curL, curR;
Map<Integer, Point> keypad = new HashMap<>();
int num = 1;
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 3; j ++) {
keypad.put(num ++, new Point(i, j));
}
}
keypad.put(num, new Point(3, 0));
keypad.put(num + 1, new Point(3, 2));
keypad.put(0, new Point(3, 1));
curL = 10;
curR = 11;
for(int i = 0; i < numbers.length; i ++) {
int n = numbers[i];
if(n == 1 || n == 4 || n == 7) {
curL = n;
answer += "L";
}
else if(n == 3 || n == 6 || n == 9) {
curR = n;
answer += "R";
}
else {
Point LP = keypad.get(curL);
Point RP = keypad.get(curR);
Point NP = keypad.get(n);
int LD = Math.abs(LP.x - NP.x) + Math.abs(LP.y - NP.y);
int RD = Math.abs(RP.x - NP.x) + Math.abs(RP.y - NP.y);
if(LD > RD) {
curR = n;
answer += "R";
}
else if(LD < RD) {
curL = n;
answer += "L";
}
else {
if(hand.equals("right")) {
curR = n;
answer += "R";
}
else {
curL = n;
answer += "L";
}
}
}
}
return answer;
}
public static void main(String[] args) {
int[] numbers = {7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2};
String hand = "left";
System.out.println(solution(numbers, hand));
}
}
728x90
'알고리즘 > 프로그래머스' 카테고리의 다른 글
| 프로그래머스 표 편집 자바 풀이 (0) | 2022.04.19 |
|---|---|
| 프로그래머스 크레인 인형뽑기 자바 풀이 (0) | 2022.04.14 |
| 프로그래머스 숫자 문자열과 영단어 자바 풀이 (0) | 2022.04.14 |
| 프로그래머스 신규 아이디 추천 자바 풀이 (0) | 2022.04.14 |
| 프로그래머스 로또의 최고 순위와 최저 순위 (0) | 2022.04.14 |