programmers.co.kr/learn/courses/30/lessons/67256
오늘은 곧 있을 카카오 인턴십을 대비해 문제를 풀어보았다.
먼저 제일 쉽다고 하는 문제인 첫 번째 문제.
(사실 이것도 어렵게 풀었다)
문제를 보자.
문제 설명
스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.
이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.
맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
- 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
- 왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때는 왼손 엄지손가락을 사용합니다.
- 오른쪽 열의 3개의 숫자 3, 6, 9를 입력할 때는 오른손 엄지손가락을 사용합니다.
- 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.
4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.
순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.
자세한건 링크 들어가서 보자.
원리는 간단하다. 그냥 그 원리대로만 구현하면 되는 문제였다.
나는 예전에 백준에서 풀었던 문제가 생각이 났다.
왜 갑자기 이 문제가 생각이 났냐고 하면, 다른건 다 모르겠고, 사이의 거리를 구하는 방법을 어떻게 구현하면 될까에서 부터 시작했다. 그러던 중 엊그제 풀었던 문제인 치킨 배달이 생각이 났고,(근데 이 문제는 잘 못푼다;;) 여기서 사용한 거리 구하는 방법을 여기다 적용했다. 벡터를 이용해 각 위치의 x,y를 저장했고 새로 갱신할때마다 저장시키고 L 또는 R를 리턴하는 방법을 구현했다.
다른 사람들 코드를 보니, 내가 너무 길게 구현한 것 같다. 그래도 난 일단 구현이 목표였으니, 나중에 시간이 있을 때 최적화를 해보겠다.
벡터안에 pair를 사용해 두 수를 넣을 수 있게 했다.
#include <string>
#include <vector>
#define X first
#define Y second
using namespace std;
int dx[4] = {1,0,-1,0};
int dy[4] = {0,1,0,-1};
vector<pair<int,int>> leftHand;
vector<pair<int,int>> rightHand;
int phone[4][3] = { {1,2,3},
{4,5,6},
{7,8,9},
{10,0,11} };
string func(int n, string h) {
if(n == 1 || n == 4 || n == 7) {
for(int i = 0; i < 4; i++) {
for(int j = 0; j < 3; j++) {
if(phone[i][j] == n) {
if(!leftHand.empty()) {
leftHand.pop_back();
leftHand.push_back({i,j});
} else {
leftHand.push_back({i,j});
}
return "L";
}
}
}
} else if (n == 3 || n == 6 || n == 9) {
for(int i = 0; i < 4; i++) {
for(int j = 0; j < 3; j++) {
if(phone[i][j] == n) {
if(!rightHand.empty()) {
rightHand.pop_back();
rightHand.push_back({i,j});
} else {
rightHand.push_back({i,j});
}
return "R";
}
}
}
} else {
auto lhand = leftHand.front();
auto rhand = rightHand.front();
vector<pair<int,int>> answer;
for(int i = 0; i < 4; i++) {
for(int j = 0; j < 3; j++) {
if(phone[i][j] == n) {
if(!answer.empty()) {
answer.pop_back();
answer.push_back({i,j});
} else {
answer.push_back({i,j});
}
}
}
}
auto an = answer.front();
int l = abs(an.X - lhand.X) + abs(an.Y - lhand.Y);
int r = abs(an.X - rhand.X) + abs(an.Y - rhand.Y);
if(l == r){
if(h == "left") {
leftHand.pop_back();
leftHand.push_back({an.X,an.Y});
return "L";
} else if(h == "right") {
rightHand.pop_back();
rightHand.push_back({an.X,an.Y});
return "R";
}
} else {
if(l < r) {
leftHand.pop_back();
leftHand.push_back({an.X,an.Y});
return "L";
} else {
rightHand.pop_back();
rightHand.push_back({an.X,an.Y});
return "R";
}
}
}
}
string solution(vector<int> numbers, string hand) {
string answer = "";
leftHand.push_back({3,0});
rightHand.push_back({3,2});
for(int i = 0; i < numbers.size(); i++) {
answer += func(numbers[i], hand);
}
return answer;
}
'Algorithm > 프로그래머스' 카테고리의 다른 글
Lv1 신규 아이디 추천 (0) | 2021.06.21 |
---|---|
Lv1 폰켓몬 (0) | 2021.06.21 |
Lv 2 주식가격 (0) | 2021.06.18 |
Lv2 전화번호 목록 (0) | 2021.06.17 |
Lv1 완주하지 못한 선수 (0) | 2021.06.17 |
댓글