⭐아이디어
1 4 7 은 무조건 왼손
3 6 9 는 무조건 오른손
2 5 8 0 은 현재 양손 중 가까운 곳 but 거리가 같으면 주손
키패드의 배열 번호
00 01 02
10 11 12
20 21 22
30 31 32
ex) 왼손 1번에서 5번으로 간다?
2칸 이동해야함 00 -> 01 -> 11
즉 |0-1| + |0-1| = 2 를 통해서 구할 수 있음
1. 왼손과 오른손 위치를 저장해둘 필드를 만들자
2. 숫자형태로 1=0 2=1 3=2 4=10 ... map에 저장하자
3. 꺼내면서 판단하자
💡풀이
import java.util.HashMap;
import java.util.Map;
class Solution {
public String solution(int[] numbers, String hand) {
StringBuilder answer = new StringBuilder();
Map<Integer, Integer> map = new HashMap<>();
for(int i = 1; i < 10; i++) {
int row = (i - 1) / 3;
int col = (i - 1) % 3;
map.put(i, row * 10 + col);
}
map.put(0, 31); // 0의 좌표
map.put(11, 30); // *의 좌표
map.put(12, 32); // #의 좌표
int nowL = 11;
int nowR = 12;
for(int number : numbers) {
char handToUse;
switch(number) {
case 1, 4, 7:
handToUse = 'L';
break;
case 3, 6, 9:
handToUse = 'R';
break;
default: // 2, 5, 8, 0
int rangeL = getDistance(nowL, number, map);
int rangeR = getDistance(nowR, number, map);
if(rangeL < rangeR) {
handToUse = 'L';
} else if(rangeR < rangeL) {
handToUse = 'R';
} else { // 거리가 같을 경우
handToUse = (hand.equals("right")) ? 'R' : 'L';
}
break;
}
if(handToUse == 'L') {
nowL = number;
answer.append("L");
} else {
nowR = number;
answer.append("R");
}
}
return answer.toString();
}
// 두 키패드 위치 간의 거리를 계산하는 메소드
private int getDistance(int now, int number, Map<Integer, Integer> map) {
int x = map.get(now);
int y = map.get(number);
return Math.abs(x / 10 - y / 10) + Math.abs(x % 10 - y % 10);
}
}
💡풀이 2
- 개선된 switch문 사용해보기
import java.util.HashMap;
import java.util.Map;
class Solution {
public String solution(int[] numbers, String hand) {
StringBuilder answer = new StringBuilder();
Map<Integer, Integer> map = new HashMap<>();
for(int i = 1; i < 10; i++) {
int row = (i - 1) / 3;
int col = (i - 1) % 3;
map.put(i, row * 10 + col);
}
map.put(0, 31); // 0의 좌표
map.put(11, 30); // *의 좌표
map.put(12, 32); // #의 좌표
int nowL = 11;
int nowR = 12;
for(int number : numbers) {
char handToUse = switch(number) {
case 1, 4, 7 -> 'L';
case 3, 6, 9 -> 'R';
default -> {
int rangeL = getDistance(nowL, number, map);
int rangeR = getDistance(nowR, number, map);
if(rangeL < rangeR) {
yield 'L';
} else if(rangeR < rangeL) {
yield 'R';
} else {
yield (hand.equals("right")) ? 'R' : 'L';
}
}
};
if (handToUse == 'L') {
nowL = number;
answer.append('L');
} else {
nowR = number;
answer.append('R');
}
}
return answer.toString();
}
// 두 키패드 위치 간의 거리를 계산하는 메소드
private int getDistance(int now, int number, Map<Integer, Integer> map) {
int x = map.get(now);
int y = map.get(number);
return Math.abs(x / 10 - y / 10) + Math.abs(x % 10 - y % 10);
}
}
📖새로 배운 부분
- JAVA switch 문에 대해 글로 정리하고 최신 문법까지 학습해 보았습니다 😊
[Java] switch 문 최신 문법까지 정리해보기 (Java 14+)
Java의 switch 문은 특정 변수의 값에 따라 다른 코드를 실행할 때if-else 문보다 코드를 훨씬 깔끔하게 만들어주는 제어문입니다.Java 버전이 올라가면서 switch는 더 안전하고 강력하게 발전했습니다.
devoks.tistory.com
GitHub - okjunghyeon/Programmers_CodingTest: 프로그래머스 관련 코딩테스트 문제를 풀이한 저장소입니다.
프로그래머스 관련 코딩테스트 문제를 풀이한 저장소입니다. Contribute to okjunghyeon/Programmers_CodingTest development by creating an account on GitHub.
github.com
'CodingTest > Programmers' 카테고리의 다른 글
[프로그래머스, Java] 신규 아이디 추천 (0) | 2025.07.29 |
---|---|
[프로그래머스, Java] 성격 유형 검사하기 (0) | 2025.07.21 |
[프로그래머스, Java][PCCE 기출문제] 10번 / 데이터 분석 (0) | 2025.07.21 |
[프로그래머스, Java] 크레인 인형뽑기 게임 (0) | 2025.07.21 |
[프로그래머스, Java] 햄버거 만들기 (0) | 2025.07.21 |