반응형
Level 1 치고는 꽤 까다로운 문제여서 놀랐다.
구현 방법에는 3가지가 있을 것 같다.
- map에 숫자별로 0, 8, 5, 2 간의 거리를 저장해 놓고 불러오는 식으로 구현
- 위치정보를 좌표로 저장하여 *의 경우 (1,4)로 설정하고 #를 (4,4)로 설정하여 abs로 x좌표와 y좌표의 거리를 계산하여도 된다. 숫자들의 좌표 정보를 배열로 가지고 있으면 된다.
- DFS? 이건 좀 복잡할 것 같아서 Pass
내가 푼 풀이는 1번으로 여기서 핵심은 find이고 매번 L, R가 선택될 때 마다 해당 하는 손의 위치를 업데이트 해줘야 한다.
#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;
string solution(vector<int> numbers, string hand) {
map<pair<string, int>, int> position_diff_map =
{
{make_pair("*",0), 1},
{make_pair("*",8), 2},
{make_pair("*",5), 3},
{make_pair("*",2), 4},
{make_pair("7",0), 2},
{make_pair("7",8), 1},
{make_pair("7",5), 2},
{make_pair("7",2), 3},
{make_pair("4",0), 3},
{make_pair("4",8), 2},
{make_pair("4",5), 1},
{make_pair("4",2), 2},
{make_pair("1",0), 4},
{make_pair("1",8), 3},
{make_pair("1",5), 2},
{make_pair("1",2), 1},
{make_pair("#",0), 1},
{make_pair("#",8), 2},
{make_pair("#",5), 3},
{make_pair("#",2), 4},
{make_pair("9",0), 2},
{make_pair("9",8), 1},
{make_pair("9",5), 2},
{make_pair("9",2), 3},
{make_pair("6",0), 3},
{make_pair("6",8), 2},
{make_pair("6",5), 1},
{make_pair("6",2), 2},
{make_pair("3",0), 4},
{make_pair("3",8), 3},
{make_pair("3",5), 2},
{make_pair("3",2), 1},
{make_pair("0",0), 0},
{make_pair("0",8), 1},
{make_pair("0",5), 2},
{make_pair("0",2), 3},
{make_pair("8",0), 1},
{make_pair("8",8), 0},
{make_pair("8",5), 1},
{make_pair("8",2), 2},
{make_pair("5",0), 2},
{make_pair("5",8), 1},
{make_pair("5",5), 0},
{make_pair("5",2), 1},
{make_pair("2",0), 3},
{make_pair("2",8), 2},
{make_pair("2",5), 1},
{make_pair("2",2), 0},
};
string answer = "";
string left_hand_pos = "*";
string right_hand_pos = "#";
for (auto i = 0; i < numbers.size(); i++)
{
if (numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7) {
answer += 'L';
left_hand_pos = to_string(numbers[i]);
}
else if (numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9)
{
answer += 'R';
right_hand_pos = to_string(numbers[i]);
}
else if (numbers[i] == 2 || numbers[i] == 5 || numbers[i] == 8 || numbers[i] == 0)
{
//left_hand_pos와 right_hand_pos의 차이가 가까운 곳을 누름
auto from_left_hand = position_diff_map.find(make_pair(left_hand_pos, numbers[i]));
auto from_right_hand = position_diff_map.find(make_pair(right_hand_pos, numbers[i]));
if (from_left_hand->second == from_right_hand->second)
{
if(hand.compare("left") == 0)
{
answer += 'L';
left_hand_pos = to_string(numbers[i]);
}
else
{
answer += 'R';
right_hand_pos = to_string(numbers[i]);
}
}
else if (from_left_hand->second < from_right_hand->second)
{
answer += "L";
left_hand_pos = to_string(numbers[i]);
}
else
{
answer += "R";
right_hand_pos = to_string(numbers[i]);
}
}
}
return answer;
}
https://programmers.co.kr/learn/courses/30/lessons/67256
300x250
'알고리즘 > 프로그래머스' 카테고리의 다른 글
2022 KAKAO TECH INTERNSHIP - 성격 유형 검사하기 Python (0) | 2022.09.26 |
---|---|
프로그래머스 스킬 체크 테스트 Level 1 C++ 쉬운 풀이 (0) | 2021.03.27 |
댓글