코딩테스트 연습 - 키패드 누르기
[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
- 분석
단순한 시뮬레이션 문제였습니다. 주의해야할 부분은 왼손과 오른손의 위치를 갱신해주어야 하는 점입니다. 거리 구하기를 편하게 하기 위해 pair<int, int> 타입의 pos 배열을 선언해 키패드와 동일한 구조를 만들어 사용했다.
#include <string>
#include <vector>
#include <math.h>
using namespace std;
pair<int, int> pos[10] = {{4, 2}
,{1, 1}, {1, 2}, {1, 3}
,{2, 1}, {2, 2}, {2, 3}
,{3, 1}, {3, 2}, {3, 3}};
string solution(vector<int> numbers, string hand) {
string answer = "";
pair<int, int> left = make_pair(4, 1);
pair<int, int> right = make_pair(4, 3);
for(int number: numbers) {
// 1, 4, 7
if(number % 3 == 1) {
answer += "L";
left = pos[number];
}
// 3, 6, 9
else if(number != 0 && number % 3 == 0) {
answer += "R";
right = pos[number];
}
// 2, 5, 8, 0
else {
pair<int, int> cur = pos[number];
int leftDiff = abs(left.first - cur.first) + abs(left.second - cur.second);
int rightDiff = abs(right.first - cur.first) + abs(right.second - cur.second);
// 왼손 거리가 더 짧은 경우
if(leftDiff < rightDiff) {
answer += "L";
left = cur;
}
// 오른손 거리가 더 짧은 경우
else if(rightDiff < leftDiff) {
answer += "R";
right = cur;
}
// 거리가 동일한 경우
else {
// 왼손잡이인 경우
if(hand == "left") {
answer += "L";
left = cur;
}
// 오른손잡이인 경우
else {
answer += "R";
right = cur;
}
}
}
}
return answer;
}
'Algorithm > Programmers' 카테고리의 다른 글
[찾아라 프로그래밍 마에스터 - 포켓몬] (0) | 2021.07.25 |
---|---|
[2018 KAKAO BLIND RECRUITMENT] 파일명 정렬 (0) | 2021.04.03 |
[2019 카카오 개발자 겨울 인턴십] 튜플 (0) | 2021.04.03 |
[2021 KAKAO BLIND RECRUITMENT] 순위 검색 (0) | 2021.03.31 |
[2019 카카오 개발자 겨울 인턴십] 징검다리 건너기 (0) | 2021.03.30 |
댓글