https://school.programmers.co.kr/learn/courses/30/lessons/67256
이번에 푼 방법은 코드가 너무 길어서 다른 사람 풀이를 위에 놓았다.
다른 사람 풀이
내가 하고 싶었던 2차원 배열로 각 버튼의 위치를 지정해주었다.
2차원 배열의 순서는 누를 번호와 인덱스의 위치를 일치시켜주기 위해 그런 듯
class Solution {
// 0부터 9까지 좌표 {y,x}
int[][] numpadPos = {
// 위에 사진 이미지로 보이는 전화패드를 좌표로 만든 듯
{3,1}, //0
{0,0}, //1
{0,1}, //2
{0,2}, //3
{1,0}, //4
{1,1}, //5
{1,2}, //6
{2,0}, //7
{2,1}, //8
{2,2} //9
// [9][2] 크기의 배열
};
//초기 위치
int[] leftPos = {3,0}; // *
int[] rightPos = {3,2}; // #
String hand;
public String solution(int[] numbers, String hand) {
this.hand = (hand.equals("right")) ? "R" : "L"; // 오른손 잡이라면 R을 아니면 L을
String answer = "";
for (int num : numbers) {
String Umji = pushNumber(num); // 버튼 누른 손가락 리턴해주는 메서드
answer += Umji;
// 버튼 눌렀으니 누른 버튼으로 손가락 위치 재지정
if(Umji.equals("L")) {leftPos = numpadPos[num]; continue;} // ?? 코드블록을 이렇게 쓰는 건 처음본다
if(Umji.equals("R")) {rightPos = numpadPos[num]; continue;}
}
return answer;
}
//num버튼을 누를 때 어디 손을 사용하는가
private String pushNumber(int num) {
if(num==1 || num==4 || num==7) return "L";
if(num==3 || num==6 || num==9) return "R";
// 2,5,8,0 일때 어디 손가락이 가까운가
if(getDist(leftPos, num) > getDist(rightPos, num)) return "R";
if(getDist(leftPos, num) < getDist(rightPos, num)) return "L";
//같으면 손잡이
return this.hand; // solution 생성자에서 this.hand에 미리 손잡이에 따라 R, L을 넣어놨음
}
//해당 위치와 번호 위치의 거리
private int getDist(int[] pos, int num) { // Math.abs()는 절대값 반환 메서드
return Math.abs(pos[0]-numpadPos[num][0]) + Math.abs(pos[1]-numpadPos[num][1]);
//현재 손가락 위치와 누를 번호 위치의 x,y 좌표라고 생각하면 이해하기 편함
// x1(현재 손 위치) - x2(누를 번호 위치) + y1 - y2
}
}
문제 접근
너무 길다..
뭔가 위치를 표현하려고 2차원 배열도 만들고 현재 손가락 위치에 따른 switch도 써볼까 떠올려 봤는데 정답으로 연결하기까지가 안되더라
이렇게 푸는 방법이 좋다고 할 수 없겠지만 눌러야할 버튼이 2, 5, 8, 0일 때 현재 손가락 위치에 따른 거리를 일일이 지정해줘서 주먹구구식으로라도 어떻게든 풀었다.
풀 거 같은데 잘 안되니까 오기가 생기더라
class Solution {
public String solution(int[] numbers, String hand) {
String answer = "";
int lPoint = 10;
int rPoint = 11;
// 1, 3 / 4, 6 / 7, 9은 같은 거리를 부여 받아야..?
for(int i=0; i<numbers.length; i++) {
if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7 ) {
lPoint = numbers[i];
answer += "L";
}
else if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9) {
rPoint = numbers[i];
answer += "R";
}
else {
int lPointDis = 0;
int rPointDis = 0;
// 각 버튼의 동일한 값을 넣어서 2 5 8 0과 거리를 계산해서 더 작은 쪽이 버튼 누르고
// 같은 거리면 왼손잡이는 왼손 오른손 잡이는 오른손
if(numbers[i] == 2) {
// 키패드가 2일 때의 주변 번호 거리 지정
//왼
if(lPoint == 1) {
lPointDis = 1;
}
else if(lPoint == 4) {
lPointDis = 2;
}
else if(lPoint == 7) {
lPointDis = 3;
}
else if(lPoint == 2) {
lPointDis = 0;
}
else if(lPoint == 5) {
lPointDis = 1;
}
else if(lPoint == 8) {
lPointDis = 2;
}
else if(lPoint == 0) {
lPointDis = 3;
}
else {
lPointDis = 4;
}
//오
if(rPoint == 3) {
rPointDis = 1;
}
else if(rPoint == 6) {
rPointDis = 2;
}
else if(rPoint == 9) {
rPointDis = 3;
}
else if(rPoint == 2) {
rPointDis = 0;
}
else if(rPoint == 5) {
rPointDis = 1;
}
else if(rPoint == 8) {
rPointDis = 2;
}
else if(rPoint == 0) {
rPointDis = 3;
}
else {
rPointDis = 4;
}
// 더 가까운 쪽 검사
if(lPointDis < rPointDis) {
lPoint = 2;
answer += "L";
}
else if(lPointDis > rPointDis) {
rPoint = 2;
answer += "R";
}
else {
if(hand.equals("left")) {
lPoint = 2;
answer += "L";
}
else {
rPoint = 2;
answer += "R";
}
}
}
else if(numbers[i] == 5) {
// 키패드가 5일 때의 주변 번호 거리 지정
//왼
if(lPoint == 1) {
lPointDis = 2;
}
else if(lPoint == 4) {
lPointDis = 1;
}
else if(lPoint == 7) {
lPointDis = 2;
}
else if(lPoint == 2) {
lPointDis = 1;
}
else if(lPoint == 5) {
lPointDis = 0;
}
else if(lPoint == 8) {
lPointDis = 1;
}
else if(lPoint == 0) {
lPointDis = 2;
}
else {
lPointDis = 3;
}
//오
if(rPoint == 3) {
rPointDis = 2;
}
else if(rPoint == 6) {
rPointDis = 1;
}
else if(rPoint == 9) {
rPointDis = 2;
}
else if(rPoint == 2) {
rPointDis = 1;
}
else if(rPoint == 5) {
rPointDis = 0;
}
else if(rPoint == 8) {
rPointDis = 1;
}
else if(rPoint == 0) {
rPointDis = 2;
}
else {
rPointDis = 3;
}
// 더 가까운 쪽 검사
if(lPointDis < rPointDis) {
lPoint = 5;
answer += "L";
}
else if(lPointDis > rPointDis) {
rPoint = 5;
answer += "R";
}
else {
if(hand.equals("left")) {
lPoint = 5;
answer += "L";
}
else {
rPoint = 5;
answer += "R";
}
}
}
else if(numbers[i] == 8) {
// 키패드가 8일 때의 주변 번호 거리 지정
//왼
if(lPoint == 1) {
lPointDis = 3;
}
else if(lPoint == 4) {
lPointDis = 2;
}
else if(lPoint == 7) {
lPointDis = 1;
}
else if(lPoint == 2) {
lPointDis = 2;
}
else if(lPoint == 5) {
lPointDis = 1;
}
else if(lPoint == 8) {
lPointDis = 0;
}
else if(lPoint == 0) {
lPointDis = 1;
}
else {
lPointDis = 2;
}
//오
if(rPoint == 3) {
rPointDis = 3;
}
else if(rPoint == 6) {
rPointDis = 2;
}
else if(rPoint == 9) {
rPointDis = 1;
}
else if(rPoint == 2) {
rPointDis = 2;
}
else if(rPoint == 5) {
rPointDis = 1;
}
else if(rPoint == 8) {
rPointDis = 0;
}
else if(rPoint == 0) {
rPointDis = 1;
}
else {
rPointDis = 2;
}
// 더 가까운 쪽 검사
if(lPointDis < rPointDis) {
lPoint = 8;
answer += "L";
}
else if(lPointDis > rPointDis) {
rPoint = 8;
answer += "R";
}
else {
if(hand.equals("left")) {
lPoint = 8;
answer += "L";
}
else {
rPoint = 8;
answer += "R";
}
}
}
else if(numbers[i] == 0) {
// 키패드가 0일 때의 주변 번호 거리 지정
//왼
if(lPoint == 1) {
lPointDis = 4;
}
else if(lPoint == 4) {
lPointDis = 3;
}
else if(lPoint == 7) {
lPointDis = 2;
}
else if(lPoint == 2) {
lPointDis = 3;
}
else if(lPoint == 5) {
lPointDis = 2;
}
else if(lPoint == 8) {
lPointDis = 1;
}
else if(lPoint == 0) {
lPointDis = 0;
}
else {
lPointDis = 1;
}
//오
if(rPoint == 3) {
rPointDis = 4;
}
else if(rPoint == 6) {
rPointDis = 3;
}
else if(rPoint == 9) {
rPointDis = 2;
}
else if(rPoint == 2) {
rPointDis = 3;
}
else if(rPoint == 5) {
rPointDis = 2;
}
else if(rPoint == 8) {
rPointDis = 1;
}
else if(rPoint == 0) {
rPointDis = 0;
}
else {
rPointDis = 1;
}
// 더 가까운 쪽 검사
if(lPointDis < rPointDis) {
lPoint = 0;
answer += "L";
}
else if(lPointDis > rPointDis) {
rPoint = 0;
answer += "R";
}
else {
if(hand.equals("left")) {
lPoint = 0;
answer += "L";
}
else {
rPoint = 0;
answer += "R";
}
}
}
}
}
return answer;
}
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 / K번 째 수 / JAVA / 정렬] * Arrays.copyOfRange() (0) | 2023.03.10 |
---|---|
[프로그래머스 / 모의고사 / JAVA / 완전탐색] (1) | 2023.03.10 |
[프로그래머스 / 신규 아이디 추천 / JAVA / replaceAll()] (0) | 2023.03.07 |
[프로그래머스 / 바탕화면 정리 / JAVA] (0) | 2023.03.06 |
[프로그래머스 / 두 개 뽑아서 더하기 / JAVA] (0) | 2023.03.04 |
댓글