구현 문제.
Level 1 문제는 보고 바로 이해하고 풀 수 있는 게 중요한 것 같다.
실제 코딩테스트에서는 시간 압박이 더 심하므로 빠르게 이해하고 빠르게 푸는 게 중요한 것 같다.
물론 무조건 빠르게 푸는 것 보단 한 번에 확실하게 푸는 게 중요하다.
문제풀이
문제에 나온 그대로 구현해주기만 하면 된다.
나같은 경우는 키 패드들을 좌표로 만들어놓고
왼쪽의 현재 수, 오른쪽의 현재 수를 입력받고 해당 수를 입력할 때마다 저장하는 식으로 만들었다.
또한 2, 5, 8, 0 중에 입력할 때는 현재 왼쪽 손의 좌표와 오른쪽 손의 좌표를 누르길 원하는 수와 각각
|r1 - r2| + |c1 - c2|를 해서 더 작은 값이 나오는 쪽 손으로 누르도록 했고, 둘이 같을 경우 어느 손 잡인지에 따라 다르게 누르도록 만들었다.
/*
* 프로그래머스 2020 KAKAO BLIND RECRUITMENT
* Level 1 키패드 누르기
* https://programmers.co.kr/learn/courses/30/lessons/67256
* 구현
*/
#include <iostream>
#include <string>
#include <vector>
#include <math.h>
using namespace std;
int curLeft = 10;
int curRight = 11;
pair<int, int> point[12] = {
{4, 2},
{1, 1},
{1, 2},
{1, 3},
{2, 1},
{2, 2},
{2, 3},
{3, 1},
{3, 2},
{3, 3},
{4, 1}, // 10 : *
{4, 3} // 11 : #
};
int pointDistance(int num1, int num2) {
int rDiff = abs(point[num1].first - point[num2].first);
int cDiff = abs(point[num1].second - point[num2].second);
return rDiff + cDiff;
}
string solution(vector<int> numbers, string hand) {
string answer = "";
for (int i = 0; i < numbers.size(); i++) {
int curNum = numbers[i];
if (curNum == 1 || curNum == 4 || curNum == 7) {
answer += 'L';
curLeft = curNum;
}
else if (curNum == 3 || curNum == 6 || curNum == 9) {
answer += 'R';
curRight = curNum;
}
else {
int leftDistance = pointDistance(curLeft, curNum);
int rightDistance = pointDistance(curRight, curNum);
if (leftDistance < rightDistance) {
answer += 'L';
curLeft = curNum;
}
else if (leftDistance > rightDistance) {
answer += 'R';
curRight = curNum;
}
else {
if (hand == "right") {
answer += 'R';
curRight = curNum;
}
else {
answer += 'L';
curLeft = curNum;
}
}
}
}
return answer;
}
int main() {
cout.tie(NULL);
cin.tie(NULL);
ios_base::sync_with_stdio(false);
cout << solution({ 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }, "left");
return 0;
}
'알고리즘 > Programmers' 카테고리의 다른 글
[C++] 프로그래머스 2021 KAKAO BLIND RECRUITMENT Level 1 신규 아이디 추천 (2) | 2021.11.16 |
---|