https://programmers.co.kr/learn/courses/30/lessons/67256
#include <string>
#include <vector>
#include <unordered_map>
#include <cmath>
using namespace std;
struct pos {
int x, y;
};
// 0 ~ 9 까지의 숫자 위치 매기기
void set_pos(unordered_map<int, pos> &m)
{
int key = 0;
m[key++] = {3, 1};
for (int i = 0; i < 3; ++i)
{
for (int j = 0; j < 3; ++j)
{
m[key++] = {i, j};
}
}
}
string solution(vector<int> numbers, string hand) {
// 0 ~ 9까지의 숫자 위치맵 생성
unordered_map<int, pos> pos_map;
set_pos(pos_map);
// 왼손 오른손 시작 위치
pos hand_L = { 3, 0 };
pos hand_R = { 3, 2 };
string answer = "";
for (int i = 0; i < numbers.size(); ++i)
{
char c;
int num = numbers[i];
// 왼손 영역
if (num == 1 || num == 4 || num == 7)
{
hand_L = pos_map[num];
c = 'L';
}
// 오른손 영역
else if (num == 3 || num == 6 || num == 9)
{
hand_R = pos_map[num];
c = 'R';
}
// 가운데
else
{
// 각 숫자 위치와 왼손/오른손 위치의 거리 구하기
pos p_num = pos_map[num];
int dist_R = abs(p_num.x - hand_R.x) + abs(p_num.y - hand_R.y);
int dist_L = abs(p_num.x - hand_L.x) + abs(p_num.y - hand_L.y);
// 왼손이 더 가깝거나 왼손/오른손 거리가 같은데 왼손잡이일 때
if (dist_R > dist_L || (dist_L == dist_R && hand.compare("left") == 0))
{
hand_L = p_num;
c = 'L';
}
// 오른손이 더 가깝거나 왼손/오른손 거리가 같은데 오른손잡이일 때
else if (dist_R < dist_L || (dist_L == dist_R && hand.compare("right") == 0))
{
hand_R = p_num;
c = 'R';
}
}
// 문자 더해주기
answer += c;
}
return answer;
}
이 문제를 실제 코테에서 접했더라면 괜히 첫인상에 겁먹었을 것 같다.
하지만 잘 읽어보면 정말 간단한 구현 문제이다.
여기에 map으로 숫자들의 위치를 저장한다는 아이디어를 활용하면
상대적으로 간단한 코드로 문제를 풀 수 있다.
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스]연습문제 : 야근 지수 (level 3) (c++) (0) | 2020.07.08 |
---|---|
[프로그래머스]2020 카카오 인턴십 : 수식 최대화 (level 2) (c++) (0) | 2020.07.07 |
[프로그래머스]2020 KAKAO BLIND RECRUITMENT : 문자열 압축 (level 2)(c++) (0) | 2020.07.06 |
[프로그래머스]연습문제 : 멀리 뛰기 (level 3)(c++) (0) | 2020.07.06 |
[프로그래머스]2017 카카오코드 본선 : GPS (level 3) (c++) (0) | 2020.07.05 |
댓글