GitHubSeob
C++ / 프로그래머스 / 키패드 누르기 본문
문제
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
문제풀이
int left_num = 10;
int right_num = 11;
int left_y;
int left_x;
int right_y;
int right_x;
vector<vector<int>>keypad = { {1,2,3},{4,5,6},{7,8,9},{10,0,11} };
키패드는 숫자는 숫자 그대로, *과 #은 10과 11로 표현했다.
left_num은 현재 왼손 엄지손가락이 어느 숫자 위에 있는지를 나타낸다.
right_num은 현재 오른손 엄지손가락이 어느 숫자 위에 있는지를 나타낸다.
left_y와 left_x는 키패드 번호 기준으로 왼손 엄지손가락의 좌표를 저장한다.
right_y와 right_x는 키패드 번호 기준으로 왼손 엄지손가락의 좌표를 저장한다.
if (numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7) {
left_num = numbers[i];
answer.push_back('L');
}
else if (numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9) {
right_num = numbers[i];
answer.push_back('R');
}
1, 4, 7은 무조건 왼손으로 누르므로 L을 answer에 집어넣고, 왼손 값을 바꾼다.
3, 6, 9는 무조건 오른손으로 누르므로 R을 answer에 집어넣고, 오른손 값을 바꾼다.
for (int i = 0; i < numbers.size(); ++i) {
Find();
if (numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7) {
left_num = numbers[i];
answer.push_back('L');
}
else if (numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9) {
right_num = numbers[i];
answer.push_back('R');
}
else {
for (int y = 0; y < 4; ++y) {
for (int x = 0; x < 3; ++x) {
if (numbers[i] == keypad[y][x]) {
int dis_l = abs(x - left_x) + abs(y - left_y);
int dis_r = abs(x - right_x) + abs(y - right_y);
if (dis_l == dis_r) {
if (hand[0] == 'l') {
left_num = numbers[i];
answer.push_back('L');
}
else {
right_num = numbers[i];
answer.push_back('R');
}
}
else if (dis_l > dis_r) {
right_num = numbers[i];
answer.push_back('R');
}
else {
left_num = numbers[i];
answer.push_back('L');
}
break;
}
}
}
}
}
이번 턴에 누르려는 번호와 각 손 엄지손가락의 좌표 차이를 나타내기 위한 변수 dis_l, dis_r을 선언하고, 절댓값을 하여 좌표의 거리를 구한다.
만약 거리가 같다면 왼손잡이인지, 오른손잡이인지 확인하고 answer에 push 한다.
길이가 다르면 짧은 쪽의 손가락으로 누르고 num값을 바꾼다.
코드
#include <string>
#include <vector>
#include <cmath>
using namespace std;
int left_num = 10;
int right_num = 11;
int left_y;
int left_x;
int right_y;
int right_x;
vector<vector<int>>keypad = { {1,2,3},{4,5,6},{7,8,9},{10,0,11} };
void Find() {
for (int y = 0; y < 4; ++y) {
for (int x = 0; x < 3; ++x) {
if (keypad[y][x] == left_num) {
left_y = y;
left_x = x;
}
if (keypad[y][x] == right_num) {
right_y = y;
right_x = x;
}
}
}
}
string solution(vector<int> numbers, string hand) {
string answer = "";
for (int i = 0; i < numbers.size(); ++i) {
Find();
if (numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7) {
left_num = numbers[i];
answer.push_back('L');
}
else if (numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9) {
right_num = numbers[i];
answer.push_back('R');
}
else {
for (int y = 0; y < 4; ++y) {
for (int x = 0; x < 3; ++x) {
if (numbers[i] == keypad[y][x]) {
int dis_l = abs(x - left_x) + abs(y - left_y);
int dis_r = abs(x - right_x) + abs(y - right_y);
if (dis_l == dis_r) {
if (hand[0] == 'l') {
left_num = numbers[i];
answer.push_back('L');
}
else {
right_num = numbers[i];
answer.push_back('R');
}
}
else if (dis_l > dis_r) {
right_num = numbers[i];
answer.push_back('R');
}
else {
left_num = numbers[i];
answer.push_back('L');
}
break;
}
}
}
}
}
return answer;
}
'Programmers > Level 1' 카테고리의 다른 글
C++ / 프로그래머스 / K번째수 (0) | 2021.08.15 |
---|---|
C++ / 프로그래머스 / 위클리 챌린지 2주차 / 상호 평가 (0) | 2021.08.11 |
C++ / 프로그래머스 / 크레인 인형뽑기 게임 (0) | 2021.08.08 |
C++ / 프로그래머스 / 음양 더하기 (0) | 2021.08.08 |
C++ / 프로그래머스 / 모의고사 (0) | 2021.08.08 |