티스토리 뷰

문제 링크

 

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

[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

 

 

풀이

Level 1답게 비교 구문 이용해서 푸는 문제였다.

정해진 범위기 때문에 미리 map에 담아두고 거리 비교(절대값)로 풀었다.

 

요약

 // Setting

map에 키 패드 위치(row, col) 초기화

왼손 위치 초기화

오른손 위치 초기화

 

// TODO

반복문(number 배열 크기)

{

1, 4, 7일 때,

    왼손 입력 및 위치 갱신

3, 6, 9일 때,

    오른손 입력 및 위치 갱신

나머지일 때,

    왼손, 오른손 거리 비교(절대값) --- <cmath>의 abs 사용

        왼손 가까울 때,

            왼손 입력 및 위치 갱신

        오른손 가까울 때,

            오른손 입력 및 위치 갱신

        거리가 같을 때,

            왼손잡이일 때,

                왼손 입력 및 위치 갱신

            오른손잡이일 때,

                오른손 입력 및 위치 갱신

}

 

 

 

더보기
#include <string>
#include <vector>
#include <map>
#include <cmath>

using namespace std;

// *, # 시작
// 거리 1씩
// 1, 4, 7은 무조건 왼손 / 3, 6, 9는 무조건 오른손
// 중앙은 가까운 손
// 거리 같으면 주손(hand)으로 판별

string solution(vector<int> numbers, string hand) {
    string answer = "";         // ex) "LRLRLRLR"
    
    // Setting(NumberPad)
    map<int, pair<int, int>> pad;
    pad[1] = make_pair(1, 1);       // 1행 1열
    pad[2] = make_pair(1, 2);       // 1행 2열
    pad[3] = make_pair(1, 3);
    pad[4] = make_pair(2, 1);
    pad[5] = make_pair(2, 2);
    pad[6] = make_pair(2, 3);
    pad[7] = make_pair(3, 1);
    pad[8] = make_pair(3, 2);
    pad[9] = make_pair(3, 3);
    pad[0] = make_pair(4, 2);
    
    pair<int, int> leftHand = make_pair(4, 1);    // 4행 1열, '*' 시작
    pair<int, int> rightHand = make_pair(4, 3);   // 4행 3열, '#' 시작
    
    // TODO
    for(int num: numbers){
        pair<int, int> pos(pad.find(num)->second);
        if(num == 1 || num == 4 || num == 7){
            // only 왼손
            answer+='L';
            leftHand.first = pos.first;
            leftHand.second = pos.second;
        }
        else if(num == 3 || num == 6 || num == 9){
            // only 오른손
            answer+='R';
            rightHand.first = pos.first;
            rightHand.second = pos.second;
        }
        else{
            // 비교
            int leftSum = abs(leftHand.first - pos.first) + abs(leftHand.second - pos.second);
            int rightSum = abs(rightHand.first - pos.first) + abs(rightHand.second - pos.second);
            if(leftSum < rightSum){
                answer += 'L';  // Left가 더 가깝다
                leftHand.first = pos.first;
                leftHand.second = pos.second;
            }
            else if(leftSum > rightSum){
                answer += 'R';  // Right가 더 가깝다
                rightHand.first = pos.first;
                rightHand.second = pos.second;
            }
            else if(leftSum == rightSum){
                if(hand == "left"){
                    answer += 'L';
                    leftHand.first = pos.first;
                    leftHand.second = pos.second;
                }
                else if(hand == "right"){
                    answer += 'R';
                    rightHand.first = pos.first;
                    rightHand.second = pos.second;
                }
            }
        }
    }
    
    return answer;
}
728x90
반응형
댓글
05-22 05:25
링크