본문 바로가기
OLD_알고리즘/Programmers - 알고리즘

Programmers] Lv.1 키패드 누르기

by 달승 2021. 6. 24.
 

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

[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. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.

문제에 제시된 대로 차근차근 구현하면 쉽게 풀리는 문제이다.

 

🌱 정답코드

 

 

 

 

 


 

2020 카카오 인턴십 for Tech developers 문제해설

2020년 카카오의 여름 인턴십이 시작 되었습니다.여름 인턴십의 첫번째 관문인 코딩 테스트가 2020년 5월 9일 오후 2시부터 6시까지 진행되었는데요, 온라인으로 진행되었기 때문에 코로나19로부터

tech.kakao.com

더보기

50점 받고 나가리된 코드

 

- 상하좌우 체크하고 그 왼손이나 오른손이 있으면 갱신한다.

  왼손/오른손이 없으면 새로운 거리 값을 구하고, 가까운 손의 값을 갱신해준다.

로 로직을 짰는데, 상하좌우를 체크해줄 필요가 없었다.

 

아래 문제에 제시된 대로만 구현하면 쉽게 해결되는 문제였다.

     4. 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용
          4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.

#include <string>
#include <vector>
#include <cmath>
using namespace std;

string h;
int leftTouch = 100, rightTouch = 100;

int pad[][4] = {{1,2,3}, {4,5,6},{7,8,9}, {100,0,100}};
int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, -1, 1};

string answer;

void next_touch(int num, int l, int r){
    int x = 0, y = 0;
    
    for(int i = 0; i < 4; i++){
        for(int j = 0; j < 3; j++){
            if(num == pad[i][j]){
                x = i, y = j;
            }
        }
    }
    
    bool rtouch = false, ltouch = false;
    int nx, ny = 0;
    for(int i = 0; i < 4; i++){
        nx = x + dx[i];
        ny = y + dy[i];
        
        if(nx < 0 || ny < 0 || nx >= 4 || ny >= 3) continue;
        
        if(pad[nx][ny] == r) rtouch = true;
        if(pad[nx][ny] == l) ltouch = true;
    }
    
    if(rtouch && ltouch){
        if(h == "R") {
            answer += 'R';
            rightTouch = num;
        }else {
            answer += "L";
            leftTouch = num;
        }
    }else if(!rtouch && ltouch){
        answer += "L";
        leftTouch = num;
    }else if(rtouch && !ltouch){
        answer += 'R';
        rightTouch = num;
    }else if(!rtouch && !ltouch){
        int rx, ry, lx, ly = 0;
        for(int i = 0; i < 4; i++){
            for(int j = 0; j < 3; j++){
                if(l == pad[i][j]){
                    lx = i, ly = j;
                }
                if(r == pad[i][j]){
                    rx = i, ry = j;
                }
            }
        }
        
        // abs(left.first  - x ) + abs(left.second - y);
        int disL = abs(lx  - x) + abs(ly - y);
        int disR = abs(rx  - x) + abs(ry - y);
        if(disL > disR){
            answer += 'R';
            rightTouch = num;
        }else if(disL < disR){
            answer += "L";
            leftTouch = num;
        }else if(disL == disR){
            if(h == "R") {
                answer += 'R';
                rightTouch = num;
            }else {
                answer += "L";
                leftTouch = num;
            }
        }
    }
}

string solution(vector<int> numbers, string hand) {    
    if(hand == "left") h = 'L';
    else h = 'R';
    
    leftTouch = 100, rightTouch = 100;
    for(int i = 0; i < numbers.size(); i++){
        int n = numbers[i];
        
        if(n == 1 || n == 4 || n == 7){
            answer += 'L';
            leftTouch = n;
        }
        if(n == 3 || n == 6 || n == 9){
            answer += 'R';
            rightTouch = n;
        }
        
        if(n == 2 || n == 5 || n == 8 || n == 0){
            next_touch(n, leftTouch, rightTouch);
        }
    }
    
    return answer;
}

 

댓글