728x90
코딩테스트 연습 - 키패드 누르기 | 프로그래머스 스쿨 (programmers.co.kr)
#include <string>
#include <vector>
#include <iostream>
#include <cmath>
using namespace std;
string solution(vector<int> numbers, string hand) {
string answer = "";
vector<string> ans;
vector<pair<int, int>> v[10];
pair<int, int> l = {0, 3};
pair<int, int> r = {2, 3};
v[0].push_back({1,3});
for (int i = 1; i <= 9; i++)
v[i].push_back({(i + 2) % 3, (i - 1) / 3}); //배열 위치 초기화
for(int i = 0; i < numbers.size(); i++)
{
if(numbers[i] % 3 == 1)
answer.push_back('L');
else if(numbers[i] % 3 == 0 && numbers[i] != 0)
answer.push_back('R');
else
{
if(abs(v[numbers[i]][0].first - l.first)+abs(v[numbers[i]][0].second - l.second)>abs(v[numbers[i]][0].first - r.first)+abs(v[numbers[i]][0].second - r.second))
answer.push_back('R');
else if(abs(v[numbers[i]][0].first - l.first)+abs(v[numbers[i]][0].second - l.second)<abs(v[numbers[i]][0].first - r.first)+abs(v[numbers[i]][0].second - r.second))
answer.push_back('L');
else if(abs(v[numbers[i]][0].first - l.first)+abs(v[numbers[i]][0].second - l.second)==abs(v[numbers[i]][0].first - r.first)+abs(v[numbers[i]][0].second - r.second))
{
if (hand == "right")
answer.push_back('R');
else if(hand == "left")
answer.push_back('L');
}
}
if(answer.back() == 'L')
l = v[numbers[i]][0];
else if(answer.back() == 'R')
r = v[numbers[i]][0];
}
return answer;
}
문제 풀이 방식
1.키패드의 위치를 좌표로 초기화하여 vector<pair<int, int>>에 할당해줌
1 {0,0} |
2 {1,0} |
3 {2,0} |
4 {0,1} |
5 {1,1} |
6 {2,1} |
7 {0,2} |
8 {1,2} |
9 {2,2} |
* {0,3} |
0 {1,3} |
# {2,3} |
이런 식으로 임의의 값을 설정하고 초기화해준다.
왼손, 오른손의 현재 좌표 위치는 항상 다시 설정해줘야 하는 값이므로 따로 l,r이라는 이름의 pair<int,int>형으로 선언해주고 각각 *, #의 위치로 초기화해준다.
2.numbers배열을 for문으로 돌며, 1,4,7에 속하면 L을, 3,6,9에 속하면 R을 answer에 push_back해준다.
3.2,5,8,0에 해당하는 경우 number의 위치가 L,R중 어떤 것이 가까운지 절댓값을 통해 따져서 (상하좌우로만 이동할 수 있기 때문) answer에 push_back해준다.
4.2,5,8,0과 l,r의 거리가 같을 경우 hand가 right인지 left인지 따져준다.
5.매 for문마다 answer삽입이 끝나면 l,r의 좌표 상태도 바꿔준다.
*알아두면 좋은 상식
1.string도 vector처럼 push_back가능. 단, 넣을 수 있는 요소는 char형
2.answer.back() =>string의 가장 끝문자 알 수 있음.
728x90
'알고리즘 공부(C++)' 카테고리의 다른 글
[C++]프로그래머스 게임 맵 최단거리 (BFS) (0) | 2023.06.27 |
---|---|
[C++]프로그래머스 피로도 (0) | 2023.06.23 |
[C++]프로그래머스 배달 (다익스트라 알고리즘 이해) (0) | 2023.06.20 |
BFS 이해 (0) | 2023.06.11 |
[C++]프로그래머스 네트워크 (0) | 2023.06.08 |