본문 바로가기
개발/Algorithm 문제 풀이

[C++, Python] 2020 카카오 인턴십 코딩테스트 - 키패드 누르기

by DenverAlmighty 2020. 8. 3.
반응형

 

프로그래머스 - 67256 키패드 누르기

https://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. C++

#include <string>
#include <vector>

using namespace std;

string solution(vector < int > numbers, string hand) {
    string answer = "";
    int lft_pos = -1;
    int rgt_pos = -1;


    for (int i = 0; i < numbers.size(); i++) {
        if ((numbers[i] == 1) || (numbers[i] == 4) || (numbers[i] == 7)) {
            answer += "L";
            lft_pos = numbers[i];
        }
        else if ((numbers[i] == 3) || (numbers[i] == 6) || (numbers[i] == 9)) {
            answer += "R";
            rgt_pos = numbers[i];
        }
        else {

            int lft_dist = -1;
            int rgt_dist = -1;


            if (numbers[i] == 0) numbers[i] = 11;
            if (lft_pos == -1) lft_dist = (12 - numbers[i]) / 3 + (12 - numbers[i]) % 3;
            else lft_dist = (abs(lft_pos - numbers[i]) / 3) + (abs(lft_pos - numbers[i]) % 3);

            if (rgt_pos == -1) rgt_dist = (12 - numbers[i]) / 3 + (12 - numbers[i]) % 3;
            else {
                rgt_dist = (abs(rgt_pos - numbers[i]) / 3) + (abs(rgt_pos - numbers[i]) % 3);

            }

            if (lft_dist > rgt_dist) {
                answer += "R";
                rgt_pos = numbers[i];
            }
            if (lft_dist < rgt_dist) {
                answer += "L";
                lft_pos = numbers[i];
            }
            if (lft_dist == rgt_dist) {
                if (hand == "right") {
                    answer += "R";
                    rgt_pos = numbers[i];
                }
                else if (hand == "left") {
                    answer += "L";
                    lft_pos = numbers[i];

                }

            }

        }

    }

    return answer;
}

 

2, 5, 8, 0 을 눌러야할 때는 더 가까운 손으로 눌러야한다

0이라면 11로 바꿔주고

|12- 왼손이 위치한 번호 와 누를 번호의 차 | / 3 + |12- 오른손이 위치한 번호 와 누를 번호의 차 | %3 을 하여 거리를 비교하였다.

카카오 해설을 보니 x, y 좌표를 나타내는  left_x, left_y, right_x, right_y 를 선언해 계산하였다.

그래서 파이썬은 이 방법으로 풀어보았다.

 

https://tech.kakao.com/2020/07/01/2020-internship-test/

 

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

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

tech.kakao.com

 

 

(x, y) 좌표를 아래와 같다고 보고 풀었다

(1, 1) (1, 2) (1, 3)
(2, 1) (2, 2) (2, 3)
(3, 1) (3, 2) (3, 3)
(4, 1) (4, 2) (4, 3)

 

2. Python

def solution(numbers, hand):
#initialize
    answer = ''
    lft_x = 4; lft_y = 1
    rgt_x = 4; rgt_y = 3
    x = -1; y = -1
    
    
    for n in numbers:
	#왼손 혹은 오른손
        if(n== 1 or n == 4 or n == 7):
            answer += "L"
            lft_x = n//3 + 1; lft_y = 1
        elif (n== 3 or n == 6 or n == 9):
            answer += "R"
            rgt_x = n//3; rgt_y = 3
        
        
        #가운데 줄 누르기
        else:
            if(n == 0) : x = 4
            else: x = n//3 + 1
            y = 2
                            
            lft_dist = abs(lft_x - x) + abs(lft_y - y)
            rgt_dist = abs(rgt_x - x) + abs(rgt_y - y)
            
            if(lft_dist > rgt_dist):
                answer += "R"
                rgt_x = x; rgt_y = y
            elif(lft_dist < rgt_dist):
                answer += "L"
                lft_x = x; lft_y = y
            else:
                if(hand == "right"):
                    answer += "R"
                    rgt_x = x; rgt_y = y
                elif(hand == "left"):
                    answer += "L"
                    lft_x = x; lft_y = y
    
    return answer
728x90
반응형