Post

[프로그래머스] 키패드 누르기 (C++)

[프로그래머스] 키패드 누르기 (C++)

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

문제 링크

📝 문제 요약

  • numbers 에는 누르고자 하는 키패드의 숫자가 들어온다.

  • hand에는 왼/오른손잡이에 따라 “left”나 “right”가 들어온다.

키패드 터치 규칙

1
2
3
4
5
6
왼손은 1, 4, 7를 누를 수 있다.

오른손은 3, 6, 9를 누를 수 있다.

키패드와 제일 가까운 손은 2, 5, 8, 0을 누를 수 있다.
만약 양손 모두 거리가 같다면 hand 에 따라 키패드를 누른다.

✅ 코드 설명

1
2
3
int l_pos = 9;
int r_pos = 11;
char base = hand[0] ^ 32;
  • 양손 위치를 저장할 l_pos, r_pos를 만들어준다.

    키패드 위치를 인덱스로 저장하게 된다.

  • l_pos* 위치부터 시작이니까 인덱스가 9,

    r_pos# 위치부터 시작이니까 인덱스가 11이 초기값으로 설정된다.

  • hand 의 첫글자를 빼오면 ‘l’ 또는 ‘r’이기때문에

    첫글자를 대문자로 바꾼 문자를 base 에 저장해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
for (int n : numbers) {
    if (n == 0) n = 11;
    
    char c = base;
    int n_pos = n - 1;

    if (n % 3 == 0) {
        c = 'R';
    } else if ((n - 1) % 3 == 0) {
        c = 'L';
    } else {
        int l_dist = abs(n_pos % 3 - l_pos % 3) + abs(n_pos / 3 - l_pos / 3);
        int r_dist = abs(n_pos % 3 - r_pos % 3) + abs(n_pos / 3 - r_pos / 3);
        if (l_dist != r_dist) c = (l_dist > r_dist) ? 'R' : 'L';
    }

    answer += c;
    if (c == 'L') l_pos = n_pos;
    else r_pos = n_pos;
}
return answer;
  • n 은 식별및 위치정보로만 사용할것이므로 0이라면 11으로 변경

  • n_posn-1을 넣어서 키패드 인덱스 저장

  • 오른손으로 누를 수 있는 숫자는 3, 6, 9니까 n % 3 == 0이라면 c를 ‘R’로 지정

  • 왼손으로 누를 수 있는 숫자는 1, 4, 7이니까 (n - 1) % 3 == 0이라면 c을 ‘L’로 지정

  • 2, 5, 8, 0이라면 가장 가까운 손으로 터치

    • 키패드 한줄에 3개의 숫자가 들어있으므로

      인덱스 % 3 으로 x를, 인덱스 / 3 를 y으로 삼아서 거리를 계산해준뒤

      l_dist, r_dist에 저장

    • 이미 c 에는 왼/오른손잡이에 따른 기본값이 저장되어있으므로

      제일 가까운 손에따라 c를 ‘R’이나 ‘L’으로 지정

  • c 에 지정된 문자를 answer 에 추가해주고 c에 지정된 문자에 따라

    l_pos 이나 r_pos를 키패드 위치로 변경

  • numbers를 전부 순회했다면 ‘L’과 ‘R’로 이루어진 문자열 answer를 리턴


전체코드

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
#include <string>
#include <vector>

using namespace std;

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

    int l_pos = 9;
    int r_pos = 11;
    char base = hand[0] ^ 32;

    for (int n : numbers) {
        if (n == 0) n = 11;
        
        char c = base;
        int n_pos = n - 1;

        if (n % 3 == 0) {
            c = 'R';
        } else if ((n - 1) % 3 == 0) {
            c = 'L';
        } else {
            int l_dist = abs(n_pos % 3 - l_pos % 3) + abs(n_pos / 3 - l_pos / 3);
            int r_dist = abs(n_pos % 3 - r_pos % 3) + abs(n_pos / 3 - r_pos / 3);
            if (l_dist != r_dist) c = (l_dist > r_dist) ? 'R' : 'L';
        }

        answer += c;
        if (c == 'L') l_pos = n_pos;
        else r_pos = n_pos;
    }
    return answer;
}
This post is licensed under CC BY 4.0 by the author.

Trending Tags