


<사전 생각>
문자열을 합치는 과정이 빈번히 일어나기 때문에 String += "op"식의 방법 보다는 StringBuilder.append()를 사용하는 것이 효과적이라는 사실을 생각해야 했고
제일 중요한 중간을 터치하는 손가락을 어떻게 판별 할 것인가를 고민해야 했다.
단순하게 배열을 사용하여 x,y 좌표를 두고 계산 할 생각을 하였다.
<최종 코드>
class Solution {
//시간 복잡도 O(n), 공간 복잡도 O(1)
public String whichIsNeer(int left[], int right[], int targetY, String samePoint){
int pos[] = {2,targetY};
int leftGap = Math.abs(pos[0]-left[0])+Math.abs(pos[1]-left[1]);
int rightGap = Math.abs(pos[0]-right[0])+Math.abs(pos[1]-right[1]);
if(rightGap<leftGap)
return "R";
else if(leftGap<rightGap)
return "L";
else return samePoint;
}
public String solution(int[] numbers, String hand) {
String samePoint = hand.equals("right")?"R":"L";
// 문자열길이를 수정할 때는 StringBuilder가 가장 효율적임
StringBuilder answer = new StringBuilder("");
// x,y좌표 저장
// 1-1 2-1 3-1
// 1-2 2-2 3-2
// 1-3 2-3 3-3
// 1-4 2-4 3-4
int leftLocation[] = {1,4}; // 위에서 부터 1 2 3 4는 *
int rightLocation[] = {3,4}; // 위에서 부터 1 2 3 4는 #
for(int i=0;i<numbers.length;i++){
if(numbers[i]==1||numbers[i]==4||numbers[i]==7) {
answer.append("L");
leftLocation[0] = 1;
leftLocation[1] = (numbers[i]+2)/3;
}
else if(numbers[i]==3||numbers[i]==6||numbers[i]==9) {
answer.append("R");
rightLocation[0] = 3;
rightLocation[1] = numbers[i]/3;
}
// 핵심
else{
int posY = 4;
if(numbers[i]!=0)
posY=(numbers[i]+1)/3;
String tmp = whichIsNeer(leftLocation,rightLocation,posY,samePoint);
if(tmp.equals("L")) {
leftLocation[0] = 2;
leftLocation[1] = posY;
}
else {
rightLocation[0] = 2;
rightLocation[1] = posY;
}
answer.append(tmp);
}
}
return answer.toString();
}
}
<더 생각해봐야 할 점>
좀 더 효율적으로 중앙을 터치할 손가락을 판별 할 방법은 없을까?
<링크>
https://school.programmers.co.kr/learn/courses/30/lessons/67256
'PS > Level1' 카테고리의 다른 글
| Programmers School level 1: 신규 아이디 추천 (0) | 2023.01.24 |
|---|---|
| Programmers School level 1: 성격 유형 검사하기 (1) | 2023.01.22 |
| Programmers School level 1: 신고 결과 받기 (1) | 2023.01.20 |
| Programmers School level 1: 숫자 문자열과 영단어 (0) | 2023.01.18 |
| Programmers School: 개인정보 수집 유효기간 (0) | 2023.01.14 |

