키패드 누르기 / Lv.1
문제 설명 )
스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.
![](https://blog.kakaocdn.net/dn/8MhhJ/btr4gEs0vk3/i3QzfOUc4weLCZVJKbJ3S1/img.png)
이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.
맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
- 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
- 왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때는 왼손 엄지손가락을 사용합니다.
- 오른쪽 열의 3개의 숫자 3, 6, 9를 입력할 때는 오른손 엄지손가락을 사용합니다.
- 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.
4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.
순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.
제한 사항 )
- numbers 배열의 크기는 1 이상 1,000 이하입니다.
- numbers 배열 원소의 값은 0 이상 9 이하인 정수입니다.
- hand는 "left" 또는 "right" 입니다.
- "left"는 왼손잡이, "right"는 오른손잡이를 의미합니다.
- 왼손 엄지손가락을 사용한 경우는 L, 오른손 엄지손가락을 사용한 경우는 R을 순서대로 이어붙여 문자열 형태로 return 해주세요.
입출력 예 )
입출력 예 설명 )
입출력 예 #1
순서대로 눌러야 할 번호가 [1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5]이고, 오른손잡이입니다.
따라서 "LRLLLRLLRRL"를 return 합니다.
입출력 예 #2
왼손잡이가 [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2]를 순서대로 누르면 사용한 손은 "LRLLRRLLLRR"이 됩니다.
입출력 예 #3
오른손잡이가 [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]를 순서대로 누르면 사용한 손은 "LLRLLRLLRL"이 됩니다.
풀이)
BFS를 이용하여 풀이하였다.
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
#include <string>
#include <vector>
#include <queue>
using namespace std;
// 상하좌우
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};
// 키패드
vector<vector<string>> keyPad = {{"1", "2", "3"},
{"4", "5", "6"},
{"7", "8", "9"},
{"*", "0", "#"} };
// 리턴해야 하는 값.
// 이동한 손가락의 위치, 이동 거리
// vector 0, 1번 인덱스는 이동한 손가락의 위치, 2번 인덱스는 이동거리로 생각
// BFS를 이용하여 손가락이 이동한 위치와 거리를 계산
vector<int> bfs(pair<int, int> temp, int target)
{
vector<vector<int>> visited(4, vector<int> (3, 0));
queue<pair<int, int>> q;
q.push(temp);
while(!q.empty())
{
int x = q.front().first;
int y = q.front().second;
q.pop();
// 만약 원하는 숫자를 발견했다면,
if (keyPad[x][y] == to_string(target))
{
return vector<int> {x, y, visited[x][y]};
}
for(int i = 0; i < 4; i++)
{
int x_dx = x + ::dx[i];
int y_dy = y + ::dy[i];
if((-1 < x_dx && x_dx < 4) &&
(-1 < y_dy && y_dy < 3) &&
(visited[x_dx][y_dy] == 0))
{
q.push(make_pair(x_dx, y_dy));
visited[x_dx][y_dy] = visited[x][y] + 1;
}
}
}
}
string solution(vector<int> numbers, string hand) {
string answer = "";
// 오른손, 왼손의 위치
pair<int, int> left = make_pair(3, 0);
pair<int, int> right = make_pair(3, 2);
for(int i = 0; i < numbers.size(); i++)
{
// 1, 4, 7 키패드의 경우 무조건 왼손이 이동
if (numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7)
{
vector<int> temp = bfs(left, numbers[i]);
left = make_pair(temp[0], temp[1]);
answer += "L";
}
// 3, 6, 9 키패드의 경우 무조건 오른손이 이동
else if (numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9)
{
vector<int> temp = bfs(right, numbers[i]);
right= make_pair(temp[0], temp[1]);
answer += "R";
}
// 2, 5, 8, 0 의 경우
else
{
// 이동거리가 같은 경우에는 자주 쓰는 손을 이용.
if (bfs(left, numbers[i])[2] == bfs(right, numbers[i])[2])
{
if(hand == "left")
{
vector<int> temp = bfs(left, numbers[i]);
left = make_pair(temp[0], temp[1]);
answer += "L";
}
else if (hand == "right")
{
vector<int> temp = bfs(right, numbers[i]);
right= make_pair(temp[0], temp[1]);
answer += "R";
}
}
// 이동거리가 작은 손을 이동.
else if (bfs(left, numbers[i])[2] < bfs(right, numbers[i])[2])
{
vector<int> temp = bfs(left, numbers[i]);
left = make_pair(temp[0], temp[1]);
answer += "L";
}
else if (bfs(left, numbers[i])[2] > bfs(right, numbers[i])[2])
{
vector<int> temp = bfs(right, numbers[i]);
right= make_pair(temp[0], temp[1]);
answer += "R";
}
}
}
return answer;
}
|
cs |
출처 : https://school.programmers.co.kr/learn/courses/30/lessons/67256
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
'Develop > 프로그래머스 (Cpp)' 카테고리의 다른 글
[프로그래머스] 신규 아이디 추천 (C++) (1) | 2023.03.17 |
---|---|
[프로그래머스] 크레인 인형뽑기 게임 (C++) (0) | 2023.03.17 |
[프로그래머스] 완주하지 못한 선수 (C++) (0) | 2023.03.16 |
[프로그래머스] 체육복 (C++) (0) | 2023.03.16 |
[프로그래머스] 로또의 최고 순위와 최저 순위 (C++) (0) | 2023.03.16 |