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
2. 소스코드
- 왼손을 쓸지 오른손을 쓸지 결정해야되는 숫자만 제대로 구현해주면 된다. 2, 5, 8, 0
- 거리는 그냥 두 점의 x값 끼리, y값 끼리 좌표값을 빼주고 절대값을 취해서 더해주면 된다.
- bool 변수를 두어 마지막에 left, right 결과를 처리해주는 것이 더 깔끔.
소스코드
#include <string>
#include <vector>
#define COL 4
#define ROW 3
using namespace std;
pair<int, int> Lpos = { 3,0 }, Rpos = { 3,2 };
int keypad[4][3] = {
{1,2,3},
{4,5,6},
{7,8,9},
{-1,0,-1}
};
pair<int, int> getPos(int num) {
for (int i = 0; i < COL; ++i) {
for (int j = 0; j < ROW; ++j) {
if (keypad[i][j] == num)
return { i,j };
}
}
}
int findDist(const pair<int, int>& pos, const int& num) {
pair<int, int> numPos = getPos(num);
return abs((pos.first - numPos.first)) + abs((pos.second - numPos.second));
}
string solution(vector<int> numbers, string hand) {
string answer = "";
int size = numbers.size();
// 입력할 숫자를 순회
for (int i = 0; i < size; ++i) {
// 오른손이 기본값
bool left = false;
// 현재 숫자를 저장
int cur = numbers[i];
// 무조건 왼손을 쓰는 경우
if (cur == 1 or cur == 4 or cur == 7)
left = true;
// 무조건 오른손을 쓰는 경우
else if (cur == 3 or cur == 6 or cur == 9);
// 거리와 주 손에 따라 달라지는 경우
else {
// 거리를 구하고 비교한다.
int Ldist = findDist(Lpos, cur);
int Rdist = findDist(Rpos, cur);
// 왼손이 더 먼 경우 - 오른손 사용
if (Ldist > Rdist);
// 오른손이 더 먼 경우 - 왼손 사용
else if (Rdist > Ldist) left = true;
// 거리가 같은 경우 - 주 손 사용
else if (Rdist == Ldist)
if (hand == "left") left = true;
}
// 결과에 따라 정답에 추가해준다.
if (left) answer += 'L', Lpos = getPos(cur);
else answer += 'R', Rpos = getPos(cur);
}
return answer;
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[ 프로그래머스 / 문자열 ] 추석 트래픽 (2018 KAKAO BLIND RECRUITMENT) (0) | 2020.07.28 |
---|---|
[ 프로그래머스 / stack ] 수식 최대화 (2020 카카오 인턴십) (0) | 2020.07.25 |
[ 프로그래머스 / 구현 ] 압축 (2018 KAKAO BLIND RECRUITMENT) (0) | 2020.07.23 |
[ 프로그래머스 / 문자열 / 진법 ] [3차] n진수 게임 (Kakao) (0) | 2020.07.10 |
[ 프로그래머스 / 문자열 ] [3차] 방금그곡도움말 (KaKao) (0) | 2020.07.09 |