[알고리즘] 프로그래머스_키패드 누르기

Fortice·2021년 6월 26일
0

알고리즘

목록 보기
8/18

본 블로그는 비상업적, 비영리적 용도의 학업만을 위해 글을 게시합니다.

부스트캠프 준비

  • 라이브러리 사용 시 감점으로 최대한 STL을 안쓰고 푼다.
  • C언어 환경이 있으면 C언어로 하고, C++은 보통 vector나 string return이 필요해서 결과제출에만 사용한다.

1. 문제 분석

  • 단순하게 거리를 계산해서 Left, Right를 표시해주면 된다.

2. 문제 풀이 과정(삽질)

  • 시작위치(x,y)를 왼손(0,0), 오른손(2,0) 으로 시작해서 결과가 이상했다.
  • 핸드폰을 보면 손이 아래쪽으로 (0,3), (2,3)으로 바꿨다.

3. 문제 해결

  • 구조체로 좌표를 왼손, 오른손 따로 저장해 기록하고 거리를 게산해 판단해줬다.

4. 코드

#include <string>
#include <vector>

using namespace std;

typedef struct location{
    int x;
    int y;
}Location;

int abs(int v)
{
    return v < 0 ? -v : v;
}

string solution(vector<int> numbers, string hand) {
    bool isLeft = hand[0] == 'l' ? true : false;
    char handed = isLeft ? 'L' : 'R';
    char ans[1001] = {0};
    int distanceL = 0, distanceR = 0;
    int midX = 1, midY = 0;
    int now;
    Location left = {0, 3}, right = {2, 3};
    
    for(int i = 0; i < numbers.size(); i++)
    {
        now = numbers[i];
        if(now == 0 || now % 3 == 2)
        {
            midY = (now == 0) ? 3 : now / 3;
            distanceL = abs(midX - left.x) + abs(midY - left.y);
            distanceR = abs(midX - right.x) + abs(midY - right.y);
            if(distanceL == distanceR)
            {
                ans[i] = handed;
                if(isLeft)
                {
                    left.x = midX;
                    left.y = midY;
                }
                else
                {
                    right.x = midX;
                    right.y = midY;
                }
            }
            else
            {
                if(distanceL < distanceR)
                {
                    left.x = midX;
                    left.y = midY;
                    ans[i] = 'L';
                }
                else
                {
                    right.x = midX;
                    right.y = midY;
                    ans[i] = 'R';
                }
            }
            continue;
        }
        else if(now % 3 == 1)
        {
            left.x = (now - 1) % 3;
            left.y = now / 3;
            ans[i] = 'L';
            continue;
        }
        else if(now % 3 == 0)
        {
            right.x = (now - 1) % 3;
            right.y = (now - 1) / 3;
            ans[i] = 'R';
            continue;
        }
    }
    
    string answer(ans, numbers.size());
    return answer;
}
profile
서버 공부합니다.

0개의 댓글