728x90
오랜만에 level 1
더보기
#include <string>
#include <vector>
using namespace std;
string solution(vector<int> numbers, string hand) {
string answer = "";
vector<int> l_cur = {3, 0}, r_cur = {3, 2};
vector<vector<int>> keypads{{3,1}, {0,0}, {0,1}, {0,2}, {1,0}, {1,1}, {1,2}, {2,0}, {2,1}, {2,2}};
for (int num : numbers){
switch(num){
case 1:
case 4:
case 7:
l_cur = keypads[num];
answer += 'L';
break;
case 3:
case 6:
case 9:
r_cur = keypads[num];
answer += 'R';
break;
case 2:
case 5:
case 8:
case 0:
int l_dist = abs(l_cur[0] - keypads[num][0]) + abs(l_cur[1] - keypads[num][1]);
int r_dist = abs(r_cur[0] - keypads[num][0]) + abs(r_cur[1] - keypads[num][1]);
if(l_dist < r_dist || (l_dist == r_dist && hand == "left")) {
l_cur = keypads[num];
answer += 'L';
}
else if(l_dist > r_dist || (l_dist == r_dist && hand == "right")) {
r_cur = keypads[num];
answer += 'R';
}
break;
}
}
return answer;
}
문제
https://programmers.co.kr/learn/courses/30/lessons/67256
코딩테스트 연습 - 키패드 누르기
[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] "right" "LRLLLRLLRRL" [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] "left" "LRLLRRLLLRR" [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] "right" "LLRLLRLLRL"
programmers.co.kr
728x90
[접근1]
4x3행렬에서 각 숫자의 위치를 인덱스에 따라 저장해둔다.
제일 처음 왼쪽 손가락의 위치는 (3, 0), 오른쪽 손가락의 위치는(3, 2)이다.
vector<int> l_cur = {3, 0}, r_cur = {3, 2};
vector<vector<int>> keypads{{3,1}, {0,0}, {0,1}, {0,2}, {1,0}, {1,1}, {1,2}, {2,0}, {2,1}, {2,2}};
[접근2]
1, 4, 7의 경우 왼손, 3, 6, 9의 경우 오른손, 2, 5, 8, 0의경우 각 손가락과 해당 번호사이의 맨해튼 거리를 계산한다.
만약 왼손과 거리가 작거나 둘의 거리가 같은데 왼손잡이일 경우 왼손,
오른손과 거리가 작거나 둘의 거리가 같은데 오른손잡이일 경우 오른손을 입력한다.
(난 switch문이 if else 문보다 readability가 좋다고 생각하여 swtich문을 선호한다.)
for (int num : numbers){
switch(num){
case 1:
case 4:
case 7:
l_cur = keypads[num];
answer += 'L';
break;
case 3:
case 6:
case 9:
r_cur = keypads[num];
answer += 'R';
break;
case 2:
case 5:
case 8:
case 0:
int l_dist = abs(l_cur[0] - keypads[num][0]) + abs(l_cur[1] - keypads[num][1]);
int r_dist = abs(r_cur[0] - keypads[num][0]) + abs(r_cur[1] - keypads[num][1]);
if(l_dist < r_dist || (l_dist == r_dist && hand == "left")) {
l_cur = keypads[num];
answer += 'L';
}
else if(l_dist > r_dist || (l_dist == r_dist && hand == "right")) {
r_cur = keypads[num];
answer += 'R';
}
break;
}
}
728x90
'coding > algorithm' 카테고리의 다른 글
| [programmers] Lv.3 보석 쇼핑(c++) (0) | 2022.05.01 |
|---|---|
| [programmers] Lv.2 수식 최대화(c++) (0) | 2022.05.01 |
| [programmers] Lv.2 거리두기 확인하기(c++) (0) | 2022.04.28 |
| [programmers] Lv.3 표 편집(c++) (0) | 2022.04.27 |
| [programmers] Lv.3 추석 트래픽(c++) (0) | 2022.04.25 |
댓글