728x90
코드 힌트
- 초기 설정:
- '*'와 '#'의 초기 위치를 설정합니다.
- 이 위치는 leftPos와 rightPos 배열에 저장됩니다.
- 초기 설정 후에는 이 위치들이 번호 입력에 따라 업데이트됩니다.
- 번호와 위치 매핑:
- 각 번호와 그에 해당하는 위치를 저장해야 합니다.
- 저는 이를 위해 번호를 키(key)로, 위치를 값(value)으로 하는 해시맵(HashMap)을 사용했습니다.
- 해시맵말고도 2차원 배열을 사용하셔도 됩니다.
- 이 맵은 번호를 입력하면 그 번호의 위치를 반환하는 용도로 사용됩니다.
- 손의 초기 설정:
- 사용자가 오른손잡이인지 왼손잡이인지 설정합니다
- 이 설정은 번호를 누를 때 손의 선택에 영향을 줍니다.
- 번호 입력 처리:
- 주어진 번호 배열(numbers)을 순회하면서 각 번호를 누를 때마다 손의 선택을 결정합니다.
- 왼쪽 열의 번호:
- 1, 4, 7은 항상 왼손(L)으로 선택됩니다.
- 이 경우 leftPos를 해당 번호의 위치로 업데이트합니다.
- 오른쪽 열의 번호:
- 3, 6, 9는 항상 오른손(R)으로 선택됩니다.
- 이 경우 rightPos를 해당 번호의 위치로 업데이트합니다.
- 가운데 열의 번호:
- 2, 5, 8, 0은 현재 손 위치와 거리를 계산하여 결정됩니다.
- 왼손과 오른손 중 더 가까운 손을 선택합니다.
- 거리가 같다면 사용자가 설정한 손잡이에 따라 선택됩니다.
- 선택된 손의 위치를 해당 번호의 위치로 업데이트합니다.
- 결과 문자열 구성:
- 각 번호에 대해 결정된 손(L 또는 R)을 문자열에 추가하여 최종 결과를 형성합니다.
정답은 더보기 클릭
더보기
import java.util.*;
class Solution {
// 편하게 사용할려고 static을 사용했지만 원하시는 입맛으로 사용하세요
// 초기 위치 설정: '*'와 '#'의 위치
static int[] leftPos = {3,0};
static int[] rightPos = {3,2};
static boolean isRightHanded;
static HashMap<Integer,int[]> numberPositions;
public String solution(int[] numbers, String handedness) {
StringBuilder result = new StringBuilder();
// 번호의 위치를 설정하는 맵 생성
numberPositions = generateNumberPositions();
// 사용자가 오른손잡이인지 왼손잡이인지 설정
isRightHanded = handedness.equals("right");
// 각 번호에 대해 손 위치 결정
for (int number : numbers) {
int[] pos = numberPositions.get(number);
// 번호를 누를 손 결정
String hand = determineHand(pos);
// 손 위치 업데이트
if (hand.equals("R")) {
rightPos = pos;
} else {
leftPos = pos;
}
// 결과 문자열에 손 추가
result.append(hand);
}
return result.toString();
}
// 번호를 누를 손을 결정하는 메소드
static String determineHand(int[] pos) {
if (pos[1] == 0) return "L"; // 왼쪽 열의 번호 (1, 4, 7)
else if (pos[1] == 2) return "R"; // 오른쪽 열의 번호 (3, 6, 9)
// 가운데 열의 번호 (2, 5, 8, 0)일 경우 거리 계산
if (calculateDistance(pos)) return "R";
else return "L";
}
// 현재 손의 위치와 번호 위치 간의 거리를 계산하는 메소드
static boolean calculateDistance(int[] pos) {
int leftDist = Math.abs(pos[0] - leftPos[0]) + Math.abs(pos[1] - leftPos[1]);
int rightDist = Math.abs(pos[0] - rightPos[0]) + Math.abs(pos[1] - rightPos[1]);
if (leftDist > rightDist) return true;
else if (leftDist < rightDist) return false;
return isRightHanded;
}
// 번호의 위치를 맵으로 생성하는 메소드
static HashMap<Integer,int[]> generateNumberPositions() {
int[][] numbersArray = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
{-1, 0, -1}
};
HashMap<Integer,int[]> positionsMap = new HashMap<>();
for (int i = 0; i < numbersArray.length; i++) {
for (int j = 0; j < numbersArray[i].length; j++) {
int key = numbersArray[i][j];
int[] value = {i, j};
// -1은 무시 (키패드의 '*'와 '#')
if (key != -1) {
positionsMap.put(key, value);
}
}
}
return positionsMap;
}
}
728x90
'프로그래머스(Java) > Level 1' 카테고리의 다른 글
[프로그래머스] [PCCE 기출문제] 9번 / 이웃한 칸 (0) | 2024.08.06 |
---|---|
[프로그래머스] 크레인 인형뽑기 게임 (0) | 2024.08.05 |
[프로그래머스] 달리기 경주 (0) | 2024.08.02 |
[프로그래머스] 수박수박수박수박수박수? (0) | 2024.08.01 |
[프로그래머스] 핸드폰 번호 가리기 (0) | 2024.08.01 |