본문 바로가기
Algorithm/프로그래머스

2020 카카오 인턴 - 키패드 누르기

by IT learning 2021. 5. 5.
728x90

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

메인 사진

 

오늘은 곧 있을 카카오 인턴십을 대비해 문제를 풀어보았다.

 

먼저 제일 쉽다고 하는 문제인 첫 번째 문제.

(사실 이것도 어렵게 풀었다)

 

문제를 보자.

 

문제 설명

스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.

이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.
맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.

  1. 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
  2. 왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때는 왼손 엄지손가락을 사용합니다.
  3. 오른쪽 열의 3개의 숫자 3, 6, 9를 입력할 때는 오른손 엄지손가락을 사용합니다.
  4. 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.
    4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.

순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.

 

자세한건 링크 들어가서 보자.

 

원리는 간단하다. 그냥 그 원리대로만 구현하면 되는 문제였다.

 

나는 예전에 백준에서 풀었던 문제가 생각이 났다.

www.acmicpc.net/problem/15686

 

15686번: 치킨 배달

크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸

www.acmicpc.net

왜 갑자기 이 문제가 생각이 났냐고 하면, 다른건 다 모르겠고, 사이의 거리를 구하는 방법을 어떻게 구현하면 될까에서 부터 시작했다. 그러던 중 엊그제 풀었던 문제인 치킨 배달이 생각이 났고,(근데 이 문제는 잘 못푼다;;) 여기서 사용한 거리 구하는 방법을 여기다 적용했다. 벡터를 이용해 각 위치의 x,y를 저장했고 새로 갱신할때마다 저장시키고 L 또는 R를 리턴하는 방법을 구현했다. 

 

다른 사람들 코드를 보니, 내가 너무 길게 구현한 것 같다. 그래도 난 일단 구현이 목표였으니, 나중에 시간이 있을 때 최적화를 해보겠다.

 

벡터안에 pair를 사용해 두 수를 넣을 수 있게 했다.

#include <string>
#include <vector>
#define X first
#define Y second
using namespace std;
int dx[4] = {1,0,-1,0};
int dy[4] = {0,1,0,-1};
vector<pair<int,int>> leftHand;
vector<pair<int,int>> rightHand;
int phone[4][3] = { {1,2,3},
                    {4,5,6},
                    {7,8,9},
                    {10,0,11} };

string func(int n, string h) {
    if(n == 1 || n == 4 || n == 7) {
        for(int i = 0; i < 4; i++) {
            for(int j = 0; j < 3; j++) {
                if(phone[i][j] == n) {
                    if(!leftHand.empty()) {
                        leftHand.pop_back();
                        leftHand.push_back({i,j});
                    } else {
                        leftHand.push_back({i,j});
                    }
                    return "L";
                }
            }
        }
    } else if (n == 3 || n == 6 || n == 9) {
        for(int i = 0; i < 4; i++) {
            for(int j = 0; j < 3; j++) {
                if(phone[i][j] == n) {
                    if(!rightHand.empty()) {
                        rightHand.pop_back();
                        rightHand.push_back({i,j});
                    } else {
                        rightHand.push_back({i,j});
                    }
                    return "R";
                }
            }
        }
    } else {
        auto lhand = leftHand.front();
        auto rhand = rightHand.front();
        vector<pair<int,int>> answer;
        
        for(int i = 0; i < 4; i++) {
            for(int j = 0; j < 3; j++) {
                if(phone[i][j] == n) {
                    if(!answer.empty()) {
                        answer.pop_back();
                        answer.push_back({i,j});
                    } else {
                        answer.push_back({i,j});
                    }
                }
            }
        }
        auto an = answer.front();
        
        int l = abs(an.X - lhand.X) + abs(an.Y - lhand.Y);
        int r = abs(an.X - rhand.X) + abs(an.Y - rhand.Y);
        
        if(l == r){
            if(h == "left") {
                leftHand.pop_back();
                leftHand.push_back({an.X,an.Y});
                return "L";
            } else if(h == "right") {
                rightHand.pop_back();
                rightHand.push_back({an.X,an.Y});
                return "R";
            }
        } else {
            if(l < r) {
                leftHand.pop_back();
                leftHand.push_back({an.X,an.Y});
                return "L";
            } else {
                rightHand.pop_back();
                rightHand.push_back({an.X,an.Y});
                return "R";
            }
        }
    }
}
string solution(vector<int> numbers, string hand) {
    string answer = "";
    leftHand.push_back({3,0});
    rightHand.push_back({3,2});
    for(int i = 0; i < numbers.size(); i++) {
        answer += func(numbers[i], hand);
    }
    return answer;
}
728x90

'Algorithm > 프로그래머스' 카테고리의 다른 글

Lv1 신규 아이디 추천  (0) 2021.06.21
Lv1 폰켓몬  (0) 2021.06.21
Lv 2 주식가격  (0) 2021.06.18
Lv2 전화번호 목록  (0) 2021.06.17
Lv1 완주하지 못한 선수  (0) 2021.06.17

댓글

IT_learning's Commit