Min:D's Devlog

[프로그래머스][2020 카카오 인턴십][C++] 키패드 누르기 본문

알고리즘/프로그래머스

[프로그래머스][2020 카카오 인턴십][C++] 키패드 누르기

Min:D 2020. 9. 16. 12:10

문제

프로그래머스 2020 카카오 인턴십 - 키패드 누르기 (Level 1)

 

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

[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

 


문제 풀이

접근 방식

각 번호를 누른 손이 왼손인지 오른손인지 판단하는 문제이다.

이 문제는 주어진대로 단순 구현만 하면 되는 간단한 문제였다.

 

우선, 처음 시작이 *과 #에서 시작하기 때문에 처음 시작은 각각 10, 12로 설정해주었다.

(*은 10, 0은 11, #은 12로 치환해주었다.)

그 후, 각 번호가 누를 손이 무엇인지 판단하고, 그 손의 위치를 해당 번호로 옮겨주며 문제를 해결하였다.

 

번호가 1, 4, 7인 경우에는 왼손, 3, 6, 9인 경우에는 오른손으로 판단하도록 조건문을 만들어주었고,

그 외의 경우에는 그 번호와 현재 손의 위치와의 거리를 구하여 더 가까운 손으로 누르도록 하였다.

오른손과의 거리와 왼손과의 거리가 같은 경우에는 왼손잡이인지 오른손잡이인지를 확인하여 손을 결정해주었다.

 


풀이 코드 - C++

#include <string>
#include <vector>

using namespace std;

string solution(vector<int> numbers, string hand) {
    int len = numbers.size();
    int left = 10;
    int right = 12;
    string answer = "";
    for(int i = 0; i < len; i++) {
        if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7) {
            answer += "L";
            left = numbers[i];
        } else if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9) {
            answer += "R";
            right = numbers[i];
        } else {
            if(numbers[i] == 0)
                numbers[i] = 11;
            int left_distance = abs((left - 1)/3 - (numbers[i] - 1)/3)
                + abs((left - 1)%3 - (numbers[i] - 1)%3);
            int right_distance = abs((right - 1)/3 - (numbers[i] - 1)/3)
                + abs((right - 1)%3 - (numbers[i] - 1)%3);
            if(left_distance > right_distance) {
                answer += "R";
                right = numbers[i];
            } else if(left_distance < right_distance) {
                answer += "L";
                left = numbers[i];
            } else {
                if(hand == "right") {
                    answer += "R";
                    right = numbers[i];
                } else {
                    answer += "L";
                    left = numbers[i];
                }
            }
        }
    }
    return answer;
}

실행 결과

실행 결과 : 100.0

Comments