본문 바로가기
알고리즘/프로그래머스

[프로그래머스 / 키패드 누르기 / JAVA]

by KDW999 2023. 3. 8.

https://school.programmers.co.kr/learn/courses/30/lessons/67256

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

이번에 푼 방법은 코드가 너무 길어서 다른 사람 풀이를 위에 놓았다.

 

다른 사람 풀이

내가 하고 싶었던 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;
    }
}

댓글