https://school.programmers.co.kr/learn/courses/30/lessons/67256
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
2020 카카오 인턴십에 나온 문제입니다.
스마트폰 키패드에서 숫자를 입력할 때, 왼손과 오른손의 엄지손가락을 이용해 특정 규칙에 따라 번호를 누릅니다.
엄지손가락 사용 규칙
- 왼쪽 열(1, 4, 7): 왼손으로 누릅니다.
- 오른쪽 열(3, 6, 9): 오른손으로 누릅니다.
- 가운데 열(2, 5, 8, 0):
- 두 손가락 중 키패드와 더 가까운 손을 사용합니다.
- 거리가 같으면 오른손잡이는 오른손, 왼손잡이는 왼손을 사용합니다.
풀이 방법
키패드 번호를 좌표로 변환하여 각 손의 위치를 계산했습니다.
초기에는 왼손을 *(3, 0), 오른손을 #(3, 2) 위치에 설정했습니다.
왼쪽 열(1, 4, 7)은 항상 왼손을 사용하고, 오른쪽 열(3, 6, 9)은 오른손을 사용합니다.
가운데 열(2, 5, 8, 0)은 현재 손의 위치에서 목표 키패드까지의 맨해튼 거리를 계산해 더 가까운 손을 선택하며, 거리가 같다면 사용자의 손잡이에 따라 선택합니다.
풀이 코드
#include <string>
#include <vector>
#include <cmath>
using namespace std;
string solution(vector<int> numbers, string hand) {
int cur_rhand[2] = {3,2}, cur_lhand[2] = {3,0};
string answer = "";
for(int i : numbers){
if(i==1 || i ==4 || i==7){
answer+='L';
cur_lhand[0] = (i-1)/3;
cur_lhand[1] = 0;
}
else if(i==3 || i==6 || i==9) {
answer+='R';
cur_rhand[0] = (i-3)/3;
cur_rhand[1] = 2;
}
else{
int y = (i-2)/3;
if(i==0) y = 3;
int curr_pos[2] = {y,1};
int l_diff = abs(curr_pos[0]-cur_lhand[0]) + abs(curr_pos[1]-cur_lhand[1]);
int r_diff = abs(curr_pos[0]-cur_rhand[0]) + abs(curr_pos[1]-cur_rhand[1]);
if(l_diff < r_diff){
answer+='L';
cur_lhand[0] = curr_pos[0];
cur_lhand[1] = curr_pos[1];
}
else if(l_diff > r_diff){
answer+='R';
cur_rhand[0] = curr_pos[0];
cur_rhand[1] = curr_pos[1];
}
else{
if(hand == "right"){
answer+='R';
cur_rhand[0] = curr_pos[0];
cur_rhand[1] = curr_pos[1];
}
else{
answer+='L';
cur_lhand[0] = curr_pos[0];
cur_lhand[1] = curr_pos[1];
}
}
}
}
return answer;
}
'Algorithm > Programmers' 카테고리의 다른 글
[프로그래머스] Lv.2 프로세스 c++ (0) | 2025.01.18 |
---|---|
[프로그래머스] Lv.1 숫자 문자열과 영단어 c++ (0) | 2025.01.17 |
[프로그래머스] Lv.1 신규 아이디 추천 c++ (0) | 2025.01.17 |
[프로그래머스] Lv.1 K번째수 c++ (0) | 2025.01.17 |
[프로그래머스] Lv.2 타겟 넘버 c++ (0) | 2025.01.16 |