알고리즘/프로그래머스
[프로그래머스][2020 카카오 인턴십][C++] 키패드 누르기
Min:D
2020. 9. 16. 12:10
문제
프로그래머스 2020 카카오 인턴십 - 키패드 누르기 (Level 1)
코딩테스트 연습 - 키패드 누르기
[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
문제 풀이
접근 방식
각 번호를 누른 손이 왼손인지 오른손인지 판단하는 문제이다.
이 문제는 주어진대로 단순 구현만 하면 되는 간단한 문제였다.
우선, 처음 시작이 *과 #에서 시작하기 때문에 처음 시작은 각각 10, 12로 설정해주었다.
(*은 10, 0은 11, #은 12로 치환해주었다.)
그 후, 각 번호가 누를 손이 무엇인지 판단하고, 그 손의 위치를 해당 번호로 옮겨주며 문제를 해결하였다.
번호가 1, 4, 7인 경우에는 왼손, 3, 6, 9인 경우에는 오른손으로 판단하도록 조건문을 만들어주었고,
그 외의 경우에는 그 번호와 현재 손의 위치와의 거리를 구하여 더 가까운 손으로 누르도록 하였다.
오른손과의 거리와 왼손과의 거리가 같은 경우에는 왼손잡이인지 오른손잡이인지를 확인하여 손을 결정해주었다.
풀이 코드 - C++
#include <string>
#include <vector>
using namespace std;
string solution(vector<int> numbers, string hand) {
int len = numbers.size();
int left = 10;
int right = 12;
string answer = "";
for(int i = 0; i < len; i++) {
if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7) {
answer += "L";
left = numbers[i];
} else if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9) {
answer += "R";
right = numbers[i];
} else {
if(numbers[i] == 0)
numbers[i] = 11;
int left_distance = abs((left - 1)/3 - (numbers[i] - 1)/3)
+ abs((left - 1)%3 - (numbers[i] - 1)%3);
int right_distance = abs((right - 1)/3 - (numbers[i] - 1)/3)
+ abs((right - 1)%3 - (numbers[i] - 1)%3);
if(left_distance > right_distance) {
answer += "R";
right = numbers[i];
} else if(left_distance < right_distance) {
answer += "L";
left = numbers[i];
} else {
if(hand == "right") {
answer += "R";
right = numbers[i];
} else {
answer += "L";
left = numbers[i];
}
}
}
}
return answer;
}