[프로그래머스] 코딩테스트 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