[프로그래머스] 키패드 누르기 (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_pos에n-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.