핵심:
문제의 목표를 파악 :
각 버튼을 어느 손으로 눌렀는지 알아야 한다.
목표달성을 위한 세부목표를 파악 :
1) 현재 더 가까운 손 판별을 위해 거리를 알아야 하고
2) 거리를 알려면 좌표를 알아야 한다.
3) 좌표를 알려면 적절한 방법으로 숫자와 좌표를 매핑해야 한다.
코드
class Solution {
public String solution(int[] numbers, String hand) {
StringBuilder sb = new StringBuilder();
int leftNum = 10;
int rightNum = 12;
for (int nextNum: numbers) {
if (nextNum==0) nextNum = 11;
if (nextNum==1 || nextNum==4 || nextNum==7) {
sb.append("L");
leftNum = nextNum;
continue;
}
else if (nextNum==3 || nextNum==6 || nextNum==9) {
sb.append("R");
rightNum = nextNum;
continue;
}
else {
int leftLength = getLength(leftNum, nextNum);
int rightLength = getLength(rightNum, nextNum);
if (leftLength < rightLength) {
sb.append("L");
leftNum = nextNum;
continue;
}
else if (leftLength > rightLength) {
sb.append("R");
rightNum = nextNum;
continue;
}
else {
if (hand.equals("left")) {
sb.append("L");
leftNum = nextNum;
continue;
}
else {
sb.append("R");
rightNum = nextNum;
continue;
}
}
}
}
return sb.toString();
}
public int getLength(int nowNum, int nextNum) {
int[] numArr = new int[2];
numArr[0] = nowNum;
numArr[1] = nextNum;
int[] x = new int[2];
int[] y = new int[2];
for (int i=0; i<2; i++) {
if (numArr[i]==2 || numArr[i]==5 || numArr[i]==8 || numArr[i]==11) {
x[i] = numArr[i]/3;
y[i] = 1;
}
else {
x[i] = (numArr[i]-1)/3;
y[i] = (numArr[i]-1)%3;
}
}
return Math.abs(x[0]-x[1]) + Math.abs(y[0]-y[1]);
}
}
결과
이번 문제를 통해 알아간 것, 핵심
1. 문제 요구사항이 무엇인지, 요구사항을 위해 필요한 것이 무엇인지 차근히 파악하기
2. 숫자와 좌표를 특정한 규칙을 통해 매핑
3. 구현문제에서 너무 복잡해지거나 예외case에 대한 가지치기가 많아지면 잘못접근하고있을 가능성이 많다
'알고리즘 > 구현' 카테고리의 다른 글
[백준 19583] 싸이버 개강 총회 -구현, 문자열, HashSet (0) | 2023.02.07 |
---|---|
[백준 10972, 10973] 다음순열, 이전순열 (Java) (0) | 2022.07.17 |
프로그래머스 - 문자열 압축 (0) | 2022.06.30 |
프로그래머스[자바] - 두 개 뽑아서 더하기 (0) | 2022.06.21 |
프로그래머스[자바] - 신고결과받기 (0) | 2022.06.21 |