프로그래머스의 키패드 누르기(Lv1) 문제이다.
[ 문제풀이 ]
입력으로 눌러야 하는 숫자들이 주어질 때, 해당 키패드들을 무슨 손으로 누르는지를 출력해야 하는 문제이다.
문제 해결을 위해서 알아야 할 정보부터 세팅 하는 과정, 그리고 정답을 도출하는 과정까지 순차적으로 알아보자.
#1. 정해진 숫자와 정해지지 않은 숫자
키패드들 중에서 일부 숫자들은 반드시 어떤 손으로 눌러야 하는지 정해져 있는 키패드들이 있다.
바로 [ 1 , 4 , 7 ] 같은 경우에는 반드시 왼손으로, [ 3 , 6 , 9 ] 같은 경우에는 반드시 오른손으로 클릭을 해야 한다.
예외적으로 [ 2 , 5 , 8 , 0 ] 같은 경우에는 그 때 그 때 어느 손으로 클릭을 해야 하는지 달라지게 된다.
따라서 본인은 이를 따로 표시해 주었다.
Click[] 이라는 배열을 사용해서 표시를 해 주었는데, Click[1 / 4 / 7] = 1 , Click[3 / 6 / 9 ] = 3 , Click[2 / 5 / 8 / 0] = 2
로 표시를 해 주었다.
Click[A] = 1 은 "숫자 A는 왼손으로 눌러야 합니다."
Click[A] = 3 은 "숫자 A는 오른손으로 눌러야 합니다."
Click[A] = 2 는 "숫자 A는 왼손으로 눌러야 할지, 오른손으로 눌러야 할지 모르겠습니다." 를 의미한다.
#2. 좌표로 접근
[ 2 , 5 , 8 , 0 ] 같은 경우에는 어떤 손으로 눌러야 할지 정해지지 않는다.
그 때마다 다른 손으로 누르게 되는데, 첫 번째 조건으로는 "더 가까이 있는 손" 으로 누르는 것이고, 두 번째로 "양손의 거리가 가깝다면 어느 손잡이인지"에 따라서 다르게 된다.
즉 ! 우리는 "어느 손이 더 가까이 있는가?" 를 위해서 거리에 대한 정보를 알고 있어야 한다.
그런데, 이 키패드에서 거리를 어떻게 구할 수 있을까 ??
본인은 키패드를 "좌표로 설정"해서 거리를 구해주었다.
숫자 '1' 을 (0 , 0)으로, 숫자 '9'를 (2 , 2) 이런식으로 좌표처럼 매핑을 시켜준 것이다.
그리고 각 숫자가 가지는 좌표들을 따로 저장해 주었다.
또한 ! 왼손이 처음 시작하는 좌표는 (3 , 0) , 오른손이 처음 시작하는 좌표는 (3 , 2)로 설정을 해 주었다.
#1과 #2에서 세팅하는 과정을 보면 다음과 같다.
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
|
int Idx;
int Click[10];
pair<int, int> Hand[2];
pair<int, int> Keypad[10];
void Setting_Keypad_Pos(string hand)
{
Click[1] = Click[4] = Click[7] = 1;
Click[2] = Click[5] = Click[8] = Click[0] = 2;
Click[3] = Click[6] = Click[9] = 3;
int x, y;
x = y = 0;
for (int i = 1; i < 10; i++)
{
Keypad[i] = { x , y };
y++;
if (y == 3)
{
x++;
y = 0;
}
}
Keypad[0] = { 3 , 1 };
Hand[0] = { 3 , 0 };
Hand[1] = { 3 , 2 };
if (hand[0] == 'l') Idx = 0;
else Idx = 1;
}
|
cs |
1번 line)에 있는 Idx라는 변수는 "오른손잡이인지 왼손잡이인지"를 나타내는 변수이다.
line26 ~ 27)에서 Idx라는 변수의 값이 설정된다. 왼손잡이는 '0'으로 오른손잡이는 '1'로 표시를 해 주었다.
line8 ~ 10)은 #1에서 진행했던, 정해진 숫자들과 그렇지 않은 숫자들을 표시해 주는 과정이다.
line11 ~ 25)는 각 숫자들을 좌표처럼 매핑시키는 과정이다.
[ 소스코드 ]
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
#include <string>
#include <vector>
using namespace std;
int Idx;
int Click[10];
pair<int, int> Hand[2];
pair<int, int> Keypad[10];
void Setting_Keypad_Pos(string hand)
{
Click[1] = Click[4] = Click[7] = 1;
Click[2] = Click[5] = Click[8] = Click[0] = 2;
Click[3] = Click[6] = Click[9] = 3;
int x, y;
x = y = 0;
for (int i = 1; i < 10; i++)
{
Keypad[i] = { x , y };
y++;
if (y == 3)
{
x++;
y = 0;
}
}
Keypad[0] = { 3 , 1 };
Hand[0] = { 3 , 0 };
Hand[1] = { 3 , 2 };
if (hand[0] == 'l') Idx = 0;
else Idx = 1;
}
int Calculate_Dist(int H_Idx, int Num)
{
return{ abs(Hand[H_Idx].first - Keypad[Num].first) + abs(Hand[H_Idx].second - Keypad[Num].second)};
}
string solution(vector<int> numbers, string hand)
{
string answer = "";
Setting_Keypad_Pos(hand);
for (int i = 0; i < numbers.size(); i++)
{
int Num = numbers[i];
if (Click[Num] == 1)
{
answer += 'L';
Hand[0] = Keypad[Num];
}
else if (Click[Num] == 3)
{
answer += 'R';
Hand[1] = Keypad[Num];
}
else
{
int Left_Dist = Calculate_Dist(0, Num);
int Right_Dist = Calculate_Dist(1, Num);
if (Left_Dist < Right_Dist)
{
answer += 'L';
Hand[0] = Keypad[Num];
}
else if (Right_Dist < Left_Dist)
{
answer += 'R';
Hand[1] = Keypad[Num];
}
else
{
Hand[Idx] = Keypad[Num];
if (Idx == 0) answer += 'L';
else answer += 'R';
}
}
}
return answer;
}
|
cs |
'[ Programmers Code ] > # PG - Level1' 카테고리의 다른 글
[ 프로그래머스 다트게임 (Lv1) ] (C++) (0) | 2021.04.05 |
---|---|
[ 프로그래머스 실패율 (Lv1) ] (C++) (4) | 2021.03.30 |
[ 프로그래머스 비밀지도 (Lv1) ] (C++) (2) | 2021.03.29 |
[ 프로그래머스 크레인 인형뽑기 게임 (Lv1) ] (C++) (1) | 2021.03.12 |
[ 프로그래머스 신규 아이디 추천 (Lv1) ] (C++) (0) | 2021.01.29 |