728x90
https://programmers.co.kr/learn/courses/30/lessons/67256
상세한 문제 설명은 링크 참조
<풀이>
손가락의 처음 위치는 */#
147(왼쪽)은 무조건 왼손
369(오른쪽)은 무조건 오른손
2580(가운데)는 가까운 손으로 친다.
0만 없었으면 다른 자료구조가 필요 없이 그냥 int변수만으로 끝낼 수 있을 것 같은데, *0#때문에 처리가 조금 귀찮아서
차라리 직관적이고 깔끔하게 좌표를 저장하기로 했다.
좌표 저장은 배열이나 클래스를 사용할 수 있는데, 나는 클래스로 선언
*과#은 맨 처음을 제외하고는 누르지 않기 때문에, 0을 제외하고 생각한다면 키패드는
1 2 3
4 5 6
7 8 9
이다.
3*3 크기의 테이블에 순서대로 숫자가 저장되어 있기 때문에 규칙성을 발견할 수 있음.
행 : 1빼서 3으로 나눴을 때 몫이 행의 인덱스와 같음
열 : 2더하고 3으로 나눴을 때 나머지가 열의 인덱스와 같음
다만 0의 경우는 예외적인 상황이기때문에 따로 처리해주었다.
이를 이용해서 숫자의 좌표를 간결하게 저장할 수 있다.
Point p;
if(numbers[i] == 0)
p = new Point(1, 3);
else
p = new Point((numbers[i]+2)%3, (numbers[i]-1)/3);
이것을 저장되어있는 손가락의 좌표와 비교하면서 거리만 계산해주면 된다.
다만 전체 소스코드에서 코드가 반복되는부분이 나오는데, 이걸 처리하고싶었는데 처리할 방법을 생각하지 못했다.
좋은 아이디어가 있다면 댓글로 알려주세요!
<전체 소스코드>
class Solution {
public String solution(int[] numbers, String hand) {
String answer = "";
Point currL = new Point(0, 3);
Point currR = new Point(2, 3);
for(int i = 0; i < numbers.length; i++){
Point p;
if(numbers[i] == 0)
p = new Point(1, 3);
else
p = new Point((numbers[i]+2)%3, (numbers[i]-1)/3);
if(p.x == 0){
answer += "L";
currL = p;
} else if (p.x == 2){
answer += "R";
currR = p;
} else {
// 2 5 8 0인 경우
int ld = Math.abs(currL.x - p.x) + Math.abs(currL.y - p.y);
int rd = Math.abs(currR.x - p.x) + Math.abs(currR.y - p.y);
if(ld < rd || (ld == rd && hand.equals("left"))){
// 왼손이 가까운 경우 왼손을 이동
currL = p;
answer += "L";
} else if(ld > rd || (ld == rd && hand.equals("right"))){
currR = p;
answer += "R";
}
}
}
return answer;
}
}
class Point{
int x, y;
Point(int x, int y){
this.x = x;
this.y = y;
}
}
'플밍 > 문제풀이' 카테고리의 다른 글
[Java] BOJ16973, 백준 - 직사각형 탈출 (0) | 2022.02.09 |
---|---|
[SWEA, Java] 괄호 짝짓기 (0) | 2022.02.08 |
[Java] BOJ2573, 백준 - 빙산 (0) | 2022.02.08 |
[Java] BOJ17141, 백준 - 연구소2 (0) | 2022.02.08 |
[Java] BOJ2493, 백준 - 탑 (0) | 2022.02.08 |