[프로그래머스] 코딩테스트 LEVEL1 키패드 누르기 C++

    반응형

    #INFO

    문제이름 : 키패드 누르기

    난이도 : LEVEL1

    문제 출처 : 2020 카카오 인턴십

    코딩테스트 연습 - 키패드 누르기 | 프로그래머스 (programmers.co.kr)

     

    코딩테스트 연습 - 키패드 누르기

    [1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] "right" "LRLLLRLLRRL" [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] "left" "LRLLRRLLLRR" [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] "right" "LLRLLRLLRL"

    programmers.co.kr


    #SOLVE

    문제가 주어진 조건대로 따라가기만 하면 쉽게 풀리는 문제였다.

    우선 왼손 엄지손가락의 위치를 저장leftHand 변수와 오른손 엄지손가락의 위치를 저장rightHand 변수를 선언한다. leftHand의 초기값은 10(*), rightHand의 초기값은 12(#)으로 초기화한다.

        int leftHand = 10, rightHand = 12;

     

    다음으로 입력받은 숫자배열의 크기만큼 for loop를 진행한다.

    1, 4, 7 키 패드를 눌렀을 때는 왼손 엄지손가락으로 눌러야 한다. 따라서 i번째 원소의 값이 1, 4, 7 이라면 answer(정답 문자열)에 'L'을 추가하고 leftHand(현재 왼손 엄지 손가락이 가리키는 값)을 numbers 배열의 i번째 원소로 설정한다.

    	for(int i = 0; i < numbers.size(); i++){
    		// keypad 1, 4, 7
    		if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7){
    			answer += "L";			
    			leftHand = numbers[i];
    		}

     

    3, 6, 9 키 패드를 눌렀을 때는 오른손 엄지 손가락으로 눌러야 한다. 따라서 i번째 원소의 값이 3, 6, 9 라면 answer에 'R' 문자를 추가하고 rightHand(현재 오른손 엄지 손가락이 가리키는 값)을 numbers 배열의 i번째 원소로 설정한다.

    		// keypad 3, 6, 9
    		else if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9){
    			answer += "R";
    			rightHand = numbers[i];
    		}

     

    마지막으로 2, 5, 8, 0 키 패드를 누른 케이스이다. 이 때는 왼손 엄지손가락과 오른손 엄지손가락의 거리차를 비교해 더 가까운 엄지손가락으로 키 패드를 눌러야 한다. * 편의를 위해 키 패드 0을 눌렀을 경우 11로 값을 초기화한다.

    leftDis는 왼손 엄지 손가락과 키 패드 사이의 거리, rightDis는 오른손 엄지 손가락과 키 패드 사이의 거리를 의미한다.

    각 거리를 구하는 공식은 "엄지 손가락과 키 패드의 행의 차이" + "엄지 손가락과 키 패드의 열의 차이" 이다.

     

    만약 왼손과 오른손의 거리가 같다면(leftDis == rightDis), 왼손잡이인지 오른손잡이인지 여부에 따라 문자열에 어떤 문자를 추가할지 결정해야 한다. 만약 왼손잡이라면 L을 오른손잡이라면 R을 추가한다.

    혹은 오른손이 왼손보다 가까울 경우(leftDis > rightDis), 문자열에 R을 추가한다.

    마지막으로 왼손보다 오른손이 가까울 경우(rightDis > leftDis), 문자열에 L을 추가한다.

    		// keypad 2, 5, 8, 0
    		else if(numbers[i] == 0 || numbers[i] == 2 || numbers[i] == 5 || numbers[i] == 8){
                if(numbers[i] == 0)
                    numbers[i] = 11;
    			int leftDis = abs((leftHand-1)/3 - (numbers[i]-1)/3) + abs((leftHand-1)%3 - (numbers[i]-1)%3);
    			int rightDis = abs((rightHand-1)/3 - (numbers[i]-1)/3) + abs((rightHand-1)%3 - (numbers[i]-1)%3);
    			// 왼손 오른손 거리가 같을 경우
    			if(leftDis == rightDis){
    				if(hand == "left"){
    					leftHand = numbers[i];
    					answer += "L";
    				}
    				else if(hand == "right"){
    					rightHand = numbers[i];
    					answer += "R";
    				}
    			}
    			// 오른손이 왼손보다 가까울 경우
    			else if(leftDis > rightDis){
    				rightHand = numbers[i];
    				answer += "R";
    			}
    			// 왼손이 오른손보다 가까울 경우
    			else if(rightDis > leftDis){
    				leftHand = numbers[i];
    				answer += "L";
    			}
    			
    		}
    	}

    #CODE

    #include <string>
    #include <vector>
    #include <math.h> // use abs function
    using namespace std;
    int leftHand = -1, rightHand = -1;
    string solution(vector<int> numbers, string hand){
        string answer = "";
        int leftHand = 10, rightHand = 12;
        int leftDis = 0, rightDis = 0;
    	for(int i = 0; i < numbers.size(); i++){
    		// keypad 1, 4, 7
    		if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7){
    			answer += "L";			
    			leftHand = numbers[i];
    		}
    		
    		// keypad 3, 6, 9
    		else if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9){
    			answer += "R";
    			rightHand = numbers[i];
    		}
    		
    		// keypad 2, 5, 8, 0
    		else if(numbers[i] == 0 || numbers[i] == 2 || numbers[i] == 5 || numbers[i] == 8){
                if(numbers[i] == 0)
                    numbers[i] = 11;
    			int leftDis = abs((leftHand-1)/3 - (numbers[i]-1)/3) + abs((leftHand-1)%3 - (numbers[i]-1)%3);
    			int rightDis = abs((rightHand-1)/3 - (numbers[i]-1)/3) + abs((rightHand-1)%3 - (numbers[i]-1)%3);
    			// 왼손 오른손 거리가 같을 경우
    			if(leftDis == rightDis){
    				if(hand == "left"){
    					leftHand = numbers[i];
    					answer += "L";
    				}
    				else if(hand == "right"){
    					rightHand = numbers[i];
    					answer += "R";
    				}
    			}
    			// 오른손이 왼손보다 가까울 경우
    			else if(leftDis > rightDis){
    				rightHand = numbers[i];
    				answer += "R";
    			}
    			// 왼손이 오른손보다 가까울 경우
    			else if(rightDis > leftDis){
    				leftHand = numbers[i];
    				answer += "L";
    			}
    			
    		}
    	}
    	return answer;
    }
    반응형

    댓글

    Designed by JB FACTORY