[C++로 풀이] 키패드 누르기⭐
Categories: Programmers
Tags: Coding Test Algorithm
📌 키패드 누르기
난이도 ⭐
🚀 문제
🚀 내 풀이 ⭕
#include <string>
#include <vector>
using namespace std;
int abs(int n)
{
if (n < 0) return -n;
else return n;
}
int distance(int pos, int dest)
{
int dist = 0;
dist += abs((pos - 1) / 3 - (dest - 1) / 3); // 행의 차이
dist += abs((pos - 1) % 3 - (dest - 1) % 3); // 열의 차이
return dist;
}
string solution(vector<int> numbers, string hand) {
string answer = "";
int left = 10, right = 12;
for(int i = 0; i < numbers.size(); i++)
{
int num = (numbers[i] != 0 ? numbers[i] : 11);
if (num % 3 == 1)
{
left = num;
answer.append("L");
}
else if (num % 3 == 0)
{
right = num;
answer.append("R");
}
else
{
int left_dist = distance(left, num);
int right_dist = distance(right, num);
if (left_dist < right_dist)
{
left = num;
answer.append("L");
}
else if (right_dist < left_dist)
{
right = num;
answer.append("R");
}
else if (right_dist == left_dist)
{
if (hand == "left")
{
left = num;
answer.append("L");
}
else if (hand == "right")
{
right = num;
answer.append("R");
}
}
}
}
return answer;
}
left
,right
가 둘 중 하나라도 한번도 업데이트 되지 않는데 (2, 5, 8, 0)을 마주하여 가장 가까운 거리를 재야하는 상황이 올 수도 있으므로left
는*
인10
이라고 초기화 해놓고,right
는#
을 고려하여12
이라고 초기화.- 키패드 거리 차이를 3으로 나눈 몫(행)과 3으로 나눈 나머지(열)를 더해 구할 것이므로
0
인 경우 이에 맞워11
이라고 간주. - 3으로 나눈 몫은
a > b
인 경우a
의 몫이 더 크지만, 3으로 나눈 나머지는a
와b
의 크기 차이와 상관이 없다.- 100%3 은 1이지만 2%3 은 2이니 후자가 나머지는 더 큰 것 처럼.
1 2 3 1 2 3 0 1 2
4 5 6 -> 4 5 6 -> 3 4 5
7 8 9 7 8 9 6 7 8
* 0 # 10 11 12 9 10 11
#include <string>
#include <vector>
using namespace std;
int abs(int n)
{
if (n < 0) return -n;
else return n;
}
int distance(int pos, int dest)
{
int dist = 0;
dist += abs((pos - 1) / 3 - (dest - 1) / 3);
dist += abs((pos - 1) % 3 - (dest - 1) % 3);
return dist;
}
string solution(vector<int> numbers, string hand) {
string answer = "";
int left = 10, right = 12;
for(int i = 0; i < numbers.size(); i++)
{
int num = (numbers[i] != 0 ? numbers[i] : 11);
int used; // 0 왼손, 1 오른손
if (num % 3 == 1)
used = 0;
else if (num % 3 == 0)
used = 1;
else
{
int left_dist = distance(left, num);
int right_dist = distance(right, num);
if (left_dist < right_dist)
used = 0;
else if (right_dist < left_dist)
used = 1;
else if (right_dist == left_dist)
{
if (hand == "left")
used = 0;
else if (hand == "right")
used = 1;
}
}
switch(used)
{
case 0:
left = num;
answer.append("L");
break;
case 1:
right = num;
answer.append("R");
break;
}
}
return answer;
}
switch
문 사용하여 공통된 부분 빼기
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
Leave a comment