[프로그래머스] 코딩테스트 LEVEL1 키패드 누르기 C++
- Archive2/ProblemSolving
- 2022. 5. 18.
#INFO
문제이름 : 키패드 누르기
난이도 : LEVEL1
문제 출처 : 2020 카카오 인턴십
코딩테스트 연습 - 키패드 누르기 | 프로그래머스 (programmers.co.kr)
#SOLVE
문제가 주어진 조건대로 따라가기만 하면 쉽게 풀리는 문제였다.
우선 왼손 엄지손가락의 위치를 저장할 leftHand 변수와 오른손 엄지손가락의 위치를 저장할 rightHand 변수를 선언한다. leftHand의 초기값은 10(*), rightHand의 초기값은 12(#)으로 초기화한다.
int leftHand = 10, rightHand = 12;
다음으로 입력받은 숫자배열의 크기만큼 for loop를 진행한다.
1, 4, 7 키 패드를 눌렀을 때는 왼손 엄지손가락으로 눌러야 한다. 따라서 i번째 원소의 값이 1, 4, 7 이라면 answer(정답 문자열)에 'L'을 추가하고 leftHand(현재 왼손 엄지 손가락이 가리키는 값)을 numbers 배열의 i번째 원소로 설정한다.
for(int i = 0; i < numbers.size(); i++){
// keypad 1, 4, 7
if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7){
answer += "L";
leftHand = numbers[i];
}
3, 6, 9 키 패드를 눌렀을 때는 오른손 엄지 손가락으로 눌러야 한다. 따라서 i번째 원소의 값이 3, 6, 9 라면 answer에 'R' 문자를 추가하고 rightHand(현재 오른손 엄지 손가락이 가리키는 값)을 numbers 배열의 i번째 원소로 설정한다.
// keypad 3, 6, 9
else if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9){
answer += "R";
rightHand = numbers[i];
}
마지막으로 2, 5, 8, 0 키 패드를 누른 케이스이다. 이 때는 왼손 엄지손가락과 오른손 엄지손가락의 거리차를 비교해 더 가까운 엄지손가락으로 키 패드를 눌러야 한다. * 편의를 위해 키 패드 0을 눌렀을 경우 11로 값을 초기화한다.
leftDis는 왼손 엄지 손가락과 키 패드 사이의 거리, rightDis는 오른손 엄지 손가락과 키 패드 사이의 거리를 의미한다.
각 거리를 구하는 공식은 "엄지 손가락과 키 패드의 행의 차이" + "엄지 손가락과 키 패드의 열의 차이" 이다.
만약 왼손과 오른손의 거리가 같다면(leftDis == rightDis), 왼손잡이인지 오른손잡이인지 여부에 따라 문자열에 어떤 문자를 추가할지 결정해야 한다. 만약 왼손잡이라면 L을 오른손잡이라면 R을 추가한다.
혹은 오른손이 왼손보다 가까울 경우(leftDis > rightDis), 문자열에 R을 추가한다.
마지막으로 왼손보다 오른손이 가까울 경우(rightDis > leftDis), 문자열에 L을 추가한다.
// keypad 2, 5, 8, 0
else if(numbers[i] == 0 || numbers[i] == 2 || numbers[i] == 5 || numbers[i] == 8){
if(numbers[i] == 0)
numbers[i] = 11;
int leftDis = abs((leftHand-1)/3 - (numbers[i]-1)/3) + abs((leftHand-1)%3 - (numbers[i]-1)%3);
int rightDis = abs((rightHand-1)/3 - (numbers[i]-1)/3) + abs((rightHand-1)%3 - (numbers[i]-1)%3);
// 왼손 오른손 거리가 같을 경우
if(leftDis == rightDis){
if(hand == "left"){
leftHand = numbers[i];
answer += "L";
}
else if(hand == "right"){
rightHand = numbers[i];
answer += "R";
}
}
// 오른손이 왼손보다 가까울 경우
else if(leftDis > rightDis){
rightHand = numbers[i];
answer += "R";
}
// 왼손이 오른손보다 가까울 경우
else if(rightDis > leftDis){
leftHand = numbers[i];
answer += "L";
}
}
}
#CODE
#include <string>
#include <vector>
#include <math.h> // use abs function
using namespace std;
int leftHand = -1, rightHand = -1;
string solution(vector<int> numbers, string hand){
string answer = "";
int leftHand = 10, rightHand = 12;
int leftDis = 0, rightDis = 0;
for(int i = 0; i < numbers.size(); i++){
// keypad 1, 4, 7
if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7){
answer += "L";
leftHand = numbers[i];
}
// keypad 3, 6, 9
else if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9){
answer += "R";
rightHand = numbers[i];
}
// keypad 2, 5, 8, 0
else if(numbers[i] == 0 || numbers[i] == 2 || numbers[i] == 5 || numbers[i] == 8){
if(numbers[i] == 0)
numbers[i] = 11;
int leftDis = abs((leftHand-1)/3 - (numbers[i]-1)/3) + abs((leftHand-1)%3 - (numbers[i]-1)%3);
int rightDis = abs((rightHand-1)/3 - (numbers[i]-1)/3) + abs((rightHand-1)%3 - (numbers[i]-1)%3);
// 왼손 오른손 거리가 같을 경우
if(leftDis == rightDis){
if(hand == "left"){
leftHand = numbers[i];
answer += "L";
}
else if(hand == "right"){
rightHand = numbers[i];
answer += "R";
}
}
// 오른손이 왼손보다 가까울 경우
else if(leftDis > rightDis){
rightHand = numbers[i];
answer += "R";
}
// 왼손이 오른손보다 가까울 경우
else if(rightDis > leftDis){
leftHand = numbers[i];
answer += "L";
}
}
}
return answer;
}
'Archive2 > ProblemSolving' 카테고리의 다른 글
[프로그래머스] LEVEL1 : 같은 숫자는 싫어 C++ _ 미완 (0) | 2022.05.24 |
---|---|
[프로그래머스] LEVEL1 로또의 최고 순위와 최저 순위 C++ (0) | 2022.05.22 |
[프로그래머스] 코딩테스트 LEVEL1 정수 제곱근 판별 C++ (0) | 2022.05.16 |
[BOJ] C++ 1764 "듣보잡" 문제 풀이 _ nov (0) | 2022.05.11 |
[BOJ] C++ 2638 "치즈" 문제 풀이 _ nov (0) | 2022.05.07 |