본문 바로가기

Algorithm/프로그래머스

[2020 카카오 인턴십] 키패드 누르기

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

#include <string>
#include <vector>
#include <cstdlib>

using namespace std;

string solution(vector<int> numbers, string hand) {
	string answer = "";
	bool isRight = hand == "right";

	pair<int, int> key[12];
	key[0] = make_pair(3, 1);
	key[1] = make_pair(0, 0);
	key[2] = make_pair(0, 1);
	key[3] = make_pair(0, 2);
	key[4] = make_pair(1, 0);
	key[5] = make_pair(1, 1);
	key[6] = make_pair(1, 2);
	key[7] = make_pair(2, 0);
	key[8] = make_pair(2, 1);
	key[9] = make_pair(2, 2);
	key[10] = make_pair(3, 0);		// *
	key[11] = make_pair(3, 2);		// #

	int right = 10;
	int left = 11;

	for (int n : numbers) {
		switch (n) {
		case 1: case 4: case 7:
			answer += "L";
			left = n;
			break;
		case 3: case 6: case 9:
			answer += "R";
			right = n;
			break;
		default:
			int distR = abs(key[n].first - key[right].first) + abs(key[n].second - key[right].second);
			int distL = abs(key[n].first - key[left].first) + abs(key[n].second - key[left].second);

			if (distR < distL) {
				answer += "R";
				right = n;
			}
			else if (distL < distR) {
				answer += "L";
				left = n;
			}
			else if (isRight) {
				answer += "R";
				right = n;
			}
			else {
				answer += "L";
				left = n;
			}
		}
	}

	return answer;
}

 

분명 인턴십 지원할 때 풀었던 문젠데...

그때보다 푸는 시간이 더 걸린다ㅜㅜ 코테를 너무 놓고 살았어

 

왼손, 오른손의 현재 위치를 저장하는 변수로 left, right를 사용했고

키패드 사이의 거리를 계산해야 하므로 키패드의 좌표를 저장하는 변수 key를 사용했다.