728x90
https://programmers.co.kr/learn/courses/30/lessons/67256
문제 설명
스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.
이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.
맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
- 엄지손가락은 상하좌우 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, 4, 7은 왼쪽 손가락으로, 3, 6, 9는 오른쪽 손가락으로 누르면 된다.
생각해야 할 것은 2, 5, 8, 0의 경우 어느 손가락으로 눌러야 할지만 정하면 된다.
따라서 휴대폰 키패드를 x, y 좌표화 시켜서 (1, 1)부터 (4, 3)까지 map에 저장해주고, 해당 케이스가 나오면 거리를 구해서 눌러주었다.
거리는 간단하게 abs(x1-x2) + abs(y1-y2)인 유클리디안 거리로 구했다.
키패드의 거리 계산을 어떻게 할 것인가에 대한 방법만 잘 정하면 풀리는 문제였다.
#include <string>
#include <vector>
#include <unordered_map>
#include <cmath>
using namespace std;
typedef pair<int, int> pii;
unordered_map<string, pair<int, int>> m = { {"1", {1, 1}},
{"2", {1,2}},
{"3", {1,3}},
{"4", {2,1}},
{"5", {2,2}},
{"6", {2,3}},
{"7", {3,1}},
{"8", {3,2}},
{"9", {3,3}},
{"0", {4,2}},
{"#", {4,3}},
{"*", {4,1}} };
int distance(string left, string right, string target) {
pii l = m[left];
pii r = m[right];
pii t = m[target];
int lt = abs(l.first - t.first) + abs(l.second - t.second);
int rt = abs(r.first - t.first) + abs(r.second - t.second);
if (lt == rt)
return 0;
else
return rt-lt;
}
string solution(vector<int> numbers, string hand) {
string answer = "";
string left = "*";
string right = "#";
for (auto num : numbers) {
if (num == 1 || num == 4 || num == 7) {
answer += "L";
left = to_string(num);
}
else if (num == 3 || num == 6 || num == 9) {
answer += "R";
right = to_string(num);
}
else { // 2 5 8 0 케이스
int result = distance(left, right, to_string(num));
if ( result== 0) { // 거리가 같다면 주 손을 이용한다.
if (hand == "left") {
answer += "L";
left = to_string(num);
}
else if (hand == "right") {
answer += "R";
right = to_string(num);
}
}
else if (result > 0) { // 양수 = 왼쪽이 더 가까운 케이스
answer += "L";
left = to_string(num);
}
else { // 음수 = 오른쪽이 더 가까운 케이스
answer += "R";
right = to_string(num);
}
}
}
return answer;
}
728x90
'문제 풀이 > 프로그래머스 알고리즘, SQL' 카테고리의 다른 글
[프로그래머스 카카오 블라인드 채용 2021 3번] 순위 검색 (구현, 이진탐색) [C++] (0) | 2021.09.01 |
---|---|
[프로그래머스 위클리 챌린지 3주차] 퍼즐 조각 맞추기 (구현, BFS) [C++] (0) | 2021.08.29 |
[프로그래머스 카카오 블라인드 채용 2021 4번] 합승 택시 요금 (다익스트라, 플로이드와샬) [C++] (0) | 2021.08.22 |
[프로그래머스 LV3] 단어 변환 (BFS, DFS) [C++, JAVA] (0) | 2021.08.12 |
[프로그래머스 LV2] 최댓값과 최솟값 (문자열) [C++] (0) | 2021.07.04 |