티스토리 뷰
728x90
https://school.programmers.co.kr/learn/courses/30/lessons/67256
2020 카카오 인턴십 Level 1 문제다.
키패드가 다음과 같이 존재한다.
1 2 3
4 5 6
7 8 9
* 0 #
번호 순서대로 다음과 같은 거리를 부여하고,
각 손가락이 어떤 점수의 키패드에 위치하는지 left변수와 right변수에 저장한다.
1 1 1
2 2 2
3 3 3
4 4 4
왼쪽 키패드는 왼쪽 손가락, 오른쪽 키패드는 오른쪽 손가락을 이용했고
가운데 키패드는 거리 값을 각각 계산하여 어떤 손가락이 더 거리가 가까운지 비교했다.
만약 왼쪽 손가락이 가운데 키패드의 거리 1에, 오른쪽 손가락이 오른쪽 키패드의 거리 1에 있고
가운데 키패드의 거리 3에 가려면,
거리 차이는 똑같이 2일 것이다.
하지만 왼쪽 손가락은 이미 가운데 키패드에 있지만
오른쪽 손가락은 오른쪽 키패드에 있기 때문에 1만큼의 거리가 더 필요하다.
즉 왼쪽과 오른쪽 손가락이 거리와 별도로 가운데 키패드에 위치하는지 구분하는 것이 필요하다.
이를 구분하기 위해 손가락이 가운데 키패드에 위치한다면 거리의 마이너스 값으로 저장했다.
만약 가운데 키패드에 위치하는 것이 아니고(변수 값이 양수) 가운데 키패드에 가야 한다면 거리1을 더 더해줘야 한다.
class Solution {
public String solution(int[] numbers, String hand) {
int arr[] = {4, 1, 1, 1, 2, 2, 2, 3, 3, 3};
int left = 4, right = 4;
StringBuilder sb = new StringBuilder();
for(int i=0;i<numbers.length;i++) {
int n = numbers[i];
if(n == 1 || n == 4 || n == 7) {
left = arr[n];
sb.append("L");
}
else if(n == 2 || n == 5 || n == 8 || n == 0) {
int tmpL = left < 0 ? Math.abs(-left - arr[n]) : Math.abs(left - arr[n]) + 1;
int tmpR = right < 0 ? Math.abs(-right - arr[n]) : Math.abs(right - arr[n]) + 1;
if(tmpL < tmpR || (tmpL == tmpR && hand.equals("left"))) {
left = -arr[n];
sb.append("L");
}
else if(tmpL > tmpR || (tmpL == tmpR && hand.equals("right"))) {
right = -arr[n];
sb.append("R");
}
}
else {
right = arr[n];
sb.append("R");
}
}
return sb.toString();
}
}
728x90
'algorithm > programmers' 카테고리의 다른 글
[프로그래머스/자바] 보석 쇼핑 풀이 - 2020 카카오 인턴십 (0) | 2022.11.13 |
---|---|
[프로그래머스/자바] 수식 최대화 풀이 - 2020 카카오 인턴십 (0) | 2022.11.13 |
[프로그래머스/자바] 튜플 풀이 - 2019 카카오 개발자 겨울 인턴십 (0) | 2022.11.13 |
[프로그래머스/자바] 불량 사용자 풀이 - 2019 카카오 개발자 겨울 인턴십 (0) | 2022.11.13 |
[프로그래머스/자바] 징검다리 건너기 풀이 - 2019 카카오 개발자 겨울 인턴십 (2) | 2022.11.13 |