본문 바로가기
코딩 테스트

[프로그래머스] 키패드 누르기 (C++)

by zoodi 2021. 4. 10.
728x90

1. 문제

programmers.co.kr/learn/courses/30/lessons/67256

 

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

[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

2. 풀이

왼/오른손에서 가운데 숫자와의 거리를 구하는 방법이 관건이었던 문제!

공식(수식)을 세워서 풀었어야했다..

이 부분을 어떻게해야할지 몰라서 검색해서 다른 사람들의 방법을 참고하였다.

 

초기 left, right의 값은 각각 10, 12로 설정해주어야한다!

 

3.코드

#include <string>
#include <vector>

using namespace std;
/*
1, 4, 7 -> L
3, 6, 9 -> R
2, 5, 8 -> 가까운 손, 만약 거리 같으면 오/왼손잡이 순
*/
string solution(vector<int> numbers, string hand) {
    string answer = "";
    int size = numbers.size();
    int left=10; int right= 12;
    int left_dist, right_dist = 0;
    
    for(int i=0; i<size; i++){
        if(numbers[i]==1 || numbers[i] == 4 || numbers[i] == 7){
            left = numbers[i];
            answer += "L";
        }
        else if(numbers[i]==3 || numbers[i] == 6 || numbers[i] == 9){
            right = numbers[i];
            answer += "R";
        }
        else{
            if(numbers[i] == 0){
                numbers[i] = 11;
            }
            int tmpl = abs(numbers[i]-left);
            int tmpr = abs(numbers[i]-right);
            
            left_dist = (tmpl/3) + (tmpl%3);
            right_dist = (tmpr/3) + (tmpr%3);
            
            if(left_dist < right_dist){
                left = numbers[i];
                answer += "L";
            }
            else if(right_dist < left_dist){
                right = numbers[i];
                answer += "R";
            }
            else if(right_dist == left_dist){
                if(hand == "left"){
                    left = numbers[i];
                    answer += "L";
                }
                else{
                    right = numbers[i];
                    answer += "R";
                }
            }
        }
    }
    return answer;
}
728x90

댓글