📄 문제
https://school.programmers.co.kr/learn/courses/30/lessons/67256
💻 코드
package programmers;
public class Lv1_Kakao_220712 { // 키패드 누르기
//도움 코드
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));
}
public static String solution(int[] numbers, String hand) {
String answer = "";
int left = 10;
int right = 12; // 1
StringBuilder sb = new StringBuilder(); // 2
for (int i = 0; i < numbers.length; i++) { // 3
if (numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7) {
sb.append("L");
left = numbers[i];
} else if (numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9) {
sb.append("R");
right = numbers[i];
} else { // 4
if (numbers[i] == 0) {
numbers[i] = 11;
}
int leftNumber = (Math.abs(numbers[i] - left) / 3) + (Math.abs(numbers[i] - left) % 3);
int rightNumber = (Math.abs(numbers[i] - right) / 3) + (Math.abs(numbers[i] - right) % 3);
if (leftNumber > rightNumber) { // 5
sb.append("R");
right = numbers[i];
} else if (leftNumber < rightNumber) {
sb.append("L");
left = numbers[i];
} else { // 6
if (hand.equals("right")) {
sb.append("R");
right = numbers[i];
} else {
sb.append("L");
left = numbers[i];
}
}
}
}
answer = sb.toString();
return answer;
}
}
📌 풀이
- 카카오 문제라서 그런지 문제 이해할 때는 어렵게 느껴졌지만.. 막상 코드 보니 엄청 어려운 수준은 아니었던 거 같다.. (참고해가며 풀어 보고, 스스로 다시 한번 풀어 보았다... 아직 갈 길이 먼 프린이..🥲)
- 왼쪽과 오른쪽 시작이 * 과 #이라고 한다. 그래서 나는 1~12까지 순차적으로 값을 주면 될 것으로 생각하여 left = 10, right = 12라는 값을 초기값으로 지정하여 로직을 작성했다.
- L과 R을 더해 출력하기 위하여 StringBuilder 메서드를 사용했다.
- 파라미터로 받은 배열 길이만큼 반복하는 반복문을 만들고, 1, 4, 7 이 해당하면 빌더에 L 저장하고 해당하는 숫자를 left변수에 저장한다. 마찬가지로 3, 6, 9 가 나오면 빌더에 R 저장하고 right에 해당하는 숫자 저장
- 1, 4, 7과 3, 6, 9는 구하기 쉬웠지만, 2, 5, 8, 0을 구하기가 조금 헷갈렸던 거 같다. 우선 가운데 숫자를 가져오기 위해 left 또는 right 저장한다. 이유는 제한사항에 왼손과 오른손 중 더 작은 숫자를 고르기 위함이다.
- 그 후 무슨 값이 더 큰지 모르므로 절댓값을 기준으로 거리를 구해서 합하여 값을 구해준다.
- 각 번호들의 위아래는 3의 차이이다. 그리고 이동 거리는 1 각 번호들의 양 옆은 1의 차이이다. 그리고 이동 거리도 1
- 그럼 눌러야 하는 키패드 - 왼손의 위치를 3으로 나눈 몫 + 3으로 나눈 나머지는 손에서 키패드 간의 거리를 나타낼 수 있다.
- 구한 값이 더 작으면 해당하는 R, L을 빌더에 저장하고, 그 값을 전에 변수에 저장한다.
- 마지막 제한사항으로 두 개가 같으면 파라미터로 받은 hand 가 right 또는 left 면 그 값을 빌더와 이전 변수에 저장한다.
'Programmers' 카테고리의 다른 글
[Java] 프로그래머스 : 숫자 문자열과 영단어 (0) | 2023.05.15 |
---|---|
[Java] 프로그래머스 : 모의고사 (0) | 2022.07.06 |
[Java] 프로그래머스 : 두개 뽑아서 더하기 (0) | 2022.07.01 |
[Java] 프로그래머스 : 주식가격 (0) | 2022.06.09 |
[Java] 프로그래머스 : K번째 수 (0) | 2022.06.03 |