와이유스토리

[시뮬레이션] 프로그래머스 키패드 누르기 C++ 본문

코딩테스트/시뮬레이션

[시뮬레이션] 프로그래머스 키패드 누르기 C++

유(YOO) 2021. 12. 29. 23:33

 

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

#include <string>
#include <vector>
#include <cmath>

using namespace std;

string solution(vector<int> numbers, string hand) {
    string answer = "";
    int lstate = -1; // 0 사용하면 안됨
    int rstate = -1;
    int lx=0, ly=3, rx=2, ry=3, posx=0, posy=0; // 초기화 중요
    int loc[3][3] = {{1,2,3}, {4,5,6}, {7,8,9}};
    
    for(int i=0; i<numbers.size(); i++) {
        if ((numbers[i]==1) || (numbers[i]==4) || (numbers[i]==7)) {
            lstate = numbers[i];
            answer += 'L';
        }
        else if ((numbers[i]==3) || (numbers[i]==6) || (numbers[i]==9)) {
            rstate = numbers[i];
            answer += 'R';
        }
        else {

            for(int k=0; k<3; k++) {
                for(int j=0; j<3; j++) {
                    if (lstate == loc[k][j]) {
                        lx = j;
                        ly = k;
                    }
                    else if (lstate == 0) // 0 중요 {
                        lx = 1;
                        ly = 3;
                    }
                    if (rstate == loc[k][j]) {
                        rx = j;
                        ry = k;
                    }
                    else if (rstate == 0) {
                        rx = 1;
                        ry = 3;
                    }
                    if (numbers[i] == loc[k][j]) {
                        posx = j;
                        posy = k;
                    }
                    if (numbers[i]==0) {
                        posx = 1;
                        posy = 3;
                    }
                }
            }
            
            if (abs(lx-posx)+abs(ly-posy)>abs(rx-posx)+abs(ry-posy)) {
            //if (sqrt((lx-posx)*(lx-posx)+(ly-posy)*(ly-posy)) > sqrt((rx-posx)*(rx-posx)+(ry-posy)*(ry-posy)))
                rstate = numbers[i];
                answer += 'R';
            }
            else if (abs(lx-posx)+abs(ly-posy)<abs(rx-posx)+abs(ry-posy)) {
            //else if (sqrt((lx-posx)*(lx-posx)+(ly-posy)*(ly-posy)) < sqrt((rx-posx)*(rx-posx)+(ry-posy)*(ry-posy)))
                lstate = numbers[i];
                answer += 'L';
            }
            else {
                if (hand == "left") {
                    lstate = numbers[i];
                    answer += 'L';
                }
                else {
                    rstate = numbers[i];
                    answer += 'R';
                }
            }
        }
    }
    
    return answer;
}
Comments