✔ 키패드 누르기
문제 분석하기
1, 4, 7은 왼손 엄지손가락, 3, 6, 9는 오른손 엄지 손가락을 사용
2, 5, 8, 0은 더 가까운 엄지 손가락을 사용하되, 거리가 같다면 왼손잡이면 왼손, 오른손잡이면 오른손 엄지 손가락을 사용
이때 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으므로 대각선 이동은 불가능
사용에 따라 현재 왼손, 오른손 위치를 이동해가면서 비교
손으로 풀어보기
- 1, 4, 7일 경우 왼손 엄지손가락 추가 및 왼손의 위치 이동
- 3, 6, 9일 경우 오른손 엄지손가락 추가 및 오른손의 위치 이동
- 2, 5, 8, 0일 경우 왼손 엄지손가락과 오른손 엄지손가락 중 더 가까운 손의 엄지손가락 추가 및 손 위치 이동
- 대각선 이동은 불가능하므로 숫자와 현재 엄지손가락의 x 좌표와 y 좌표의 차이를 구해 거리를 구하도록 함
- 만약 거리가 같다면 왼손잡이면 왼손, 오른손잡이면 오른손 추가
- 각 번호를 누른 손가락을 저장한 문자열 반환
슈도코드 작성하기
numbers(순서대로 누를 번호가 담긴 배열)
hand(왼손잡이인지 오른손잡이인 지를 나타내는 문자열)
answer(각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 StringBuilder)
phone(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, *, # 순서로 폰 번호에 따른 x, y 좌표를 저장한 2차원 배열)
lIndex(왼손 엄지손가락 인덱스) = phone[10]
rIndex(오른손 엄지손가락 인덱스) = phone[11]
for(number -> numbers만큼) {
if(number이 1, 4, 7이라면) {
answer에 L 추가
lIndex를 phone[number]로 변경
}
else if(number이 3, 6, 9라면) {
answer에 R 추가
rIndex를 phone[number]로 변경
}
else {
lDistance(왼손과의 거리) = |phone[number][0] - lIndex[0]| + |phone[number][1] - lIndex[1]|
rDistance(오른손과의 거리) = |phone[number][0] - rIndex[0]| + |phone[number][1] - rIndex[1]|
if(lDistance > rDistance) {
answer에 R 추가
rIndex를 phone[number]로 변경
}
else if(rDistance > lDistance) {
answer에 L 추가
lIndex를 phone[number]로 변경
}
else {
if(hand가 right라면) {
answer에 R 추가
rIndex를 phone[number]로 변경
}
else {
answer에 L 추가
lIndex를 phone[number]로 변경
}
}
}
}
answer을 문자열로 반환
코드 구현하기
/**
* 67256) 키패드_누르기
*/
public class L042_67256 {
// numbers(순서대로 누를 번호가 담긴 배열)
// hand(왼손잡이인지 오른손잡이인 지를 나타내는 문자열)
public String solution(int[] numbers, String hand) {
// answer(각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 StringBuilder)
StringBuilder answer = new StringBuilder();
// phone(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, *, # 순서로 폰 번호에 따른 x, y 좌표를 저장한 2차원 배열)
int[][] phone = { { 3, 1 }, { 0, 0 }, { 0, 1 },
{ 0, 2 }, { 1, 0 }, { 1, 1 },
{ 1, 2 }, { 2, 0 }, { 2, 1 },
{ 2, 2 }, { 3, 0 }, { 3, 2 } };
// lIndex(왼손 엄지손가락 인덱스) - *(phone[10])
int[] lIndex = phone[10];
// rIndex(오른손 엄지손가락 인덱스) - #(phone[11])
int[] rIndex = phone[11];
for (int number : numbers) {
// number이 1, 4, 7이라면
if (number == 1 || number == 4 || number == 7) {
// answer에 L 추가
answer.append("L");
// lIndex를 phone[number]로 변경
lIndex = phone[number];
}
// number이 3, 6, 9라면
else if (number == 3 || number == 6 || number == 9) {
// answer에 R 추가
answer.append("R");
// rIndex를 phone[number]로 변경
rIndex = phone[number];
} else {
// lDistance(왼손과의 거리)
int lDistance = Math.abs(phone[number][0] - lIndex[0]) + Math.abs(phone[number][1] - lIndex[1]);
// rDistance(오른손과의 거리)
int rDistance = Math.abs(phone[number][0] - rIndex[0]) + Math.abs(phone[number][1] - rIndex[1]);
// 왼손과의 거리가 더 멀다면 오른손 사용
if (lDistance > rDistance) {
// answer에 R 추가
answer.append("R");
// rIndex를 phone[number]로 변경
rIndex = phone[number];
}
// 오른손과의 거리가 더 멀다면 왼손 사용
else if (rDistance > lDistance) {
// answer에 L 추가
answer.append("L");
// lIndex를 phone[number]로 변경
lIndex = phone[number];
}
// 두 손의 거리가 같다면
else {
// 오른손잡이라면
if (hand.equals("right")) {
// answer에 R 추가
answer.append("R");
// rIndex를 phone[number]로 변경
rIndex = phone[number];
}
// 왼손잡이라면
else {
// answer에 L 추가
answer.append("L");
// lIndex를 phone[number]로 변경
lIndex = phone[number];
}
}
}
}
// answer을 문자열로 반환
return answer.toString();
}
// 테스트 케이스
public static void main(String[] args) {
L042_67256 solution = new L042_67256();
int[] numbers = { 1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5 };
String hand = "right";
String result = solution.solution(numbers, hand);
System.out.println(result);
}
}
'Coding Test > Java 알고리즘 실전' 카테고리의 다른 글
[68935] 3진법 뒤집기 (0) | 2023.12.31 |
---|---|
[68644] 두 개 뽑아서 더하기 (0) | 2023.12.31 |
[64061] 크레인 인형뽑기 게임 (0) | 2023.12.30 |
[42889] 실패율 (0) | 2023.12.30 |
[17682] 다트 게임 (0) | 2023.12.29 |