Posts [알고리즘] 프로그래머스 - 키패드 누르기
Post
Cancel

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


문제

키패드 누르기


접근

3으로 나눈 몫과 나머지의 조합으로 생각하면 쉽다.
이를 위해서 *, 0, #은 각각 10, 11 12로 생각하고 푼다.
우선 키패드가 어떤 줄에 있는지는 3으로 나눈 나머지를 이용한다.
나머지가 1이면 왼쪽, 0이면 오른쪽, 2이면 가운데이다.
가운데 줄인 경우 거리를 계산해야 한다. 거리의 경우, 두 숫자의 차이의 몫과 나머지를 더하면 된다. 다음과 같이 구할 수 있다.

손가락이 있는 번호 \(=hand\)
눌러야할 번호 \(=key\) 거리 \(=d\)

\[t = \mid hand - key \mid d = t % 3 + t / 3\]


코드

  • 파이썬 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
def solution(numbers, hand):
    answer = ''
    left = 10
    right = 12
    for number in numbers:
        if number == 0:
            number = 11
        if number % 3 == 1:
            answer += 'L'
            left = number
        elif number % 3 == 0:
            answer += 'R'
            right = number
        else:
            l_dis = abs(number - left)
            l_dis = l_dis//3 + l_dis%3
            r_dis = abs(number - right)
            r_dis = r_dis//3 + r_dis%3
            if l_dis > r_dis:
                answer += 'R'
                right = number
            elif l_dis < r_dis:
                answer += 'L'
                left = number
            else:
                if hand == 'right':
                    answer += 'R'
                    right = number
                else:
                    answer += 'L'
                    left = number
    return answer
  • C++ 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <string>
#include <vector>
#include <cstdlib>
using namespace std;

string solution(vector<int> numbers, string hand) {
    string answer = "";
    int left = 10;
    int right = 12;
    for(int i = 0; i<numbers.size(); i++){
        if(numbers[i] == 0)
            numbers[i] = 11;
        if(numbers[i] % 3 == 1){
            answer += "L";
            left = numbers[i];
        }
        else if(numbers[i] % 3 == 0){
            answer += "R";
            right = numbers[i];
        }
        else{
            int l_dis = abs(numbers[i] - left);
            l_dis = l_dis/3 + l_dis%3;
            int r_dis = abs(numbers[i] - right);
            r_dis = r_dis/3 + r_dis%3;
            if(l_dis < r_dis){
                answer += "L";
                left = numbers[i];
            }
            else if(l_dis > r_dis){
                answer += "R";
                right = numbers[i];
            }
            else{
                if(hand == "right"){
                    answer += "R";
                    right = numbers[i];
                }
                else{
                    answer += "L";
                    left = numbers[i];
                }
            }
        }
    }
    return answer;
}


This post is licensed under CC BY 4.0 by the author.

[알고리즘] 프로그래머스 - [1차] 비밀지도

[프로그래머스 인공지능스쿨] Week3-1 Python - numpy