티스토리 뷰
성공 코드(내 코드)
1 | 2 | 3 |
4 | 5 | 6 |
7 | 8 | 9 |
* -> 10으로 두고 푼다. | 0 -> 11로 두고 푼다. | # -> 12로 두고 푼다. |
- 누르는 번호가
- 1, 4, 7 -> L
- 3, 6, 9 -> R
- 이외에는 현재 왼손이 누르고 있는 번호의 위치와 오른손이 누르고 있는 번호의 위치를 통해 더 가까운 손으로 누른다. 거리가 같은 경우 왼손잡이면 왼손으로 오른손잡이면 오른손으로 누른다.
- 누르고자 하는 번호와 현재 왼쪽/오른쪽 손이 누르고 있는 번호의 위치 사이의 거리를 측정하기 위해 distance 함수를 사용한다.
- 매개변수: 누르고자 하는 번호(num), 현재 누르고 있는 번호(now), 어느쪽 손인지(hand)
- now가 중간 줄에 있는 번호인 2, 5, 8, 11이 아니면
- 오른손인 경우 오른쪽 줄에 있는 번호를 누르고 있으므로 num을 1증가시킨다. 그리고 한 칸 이동했으므로 cnt를 1 증가시킨다.
- 왼손이 경우 왼쪽 줄에 있는 번호를 누르고 있으므로 num을 1감소시킨다. 그리고 한 칸 이동했으므로 cnt를 1증가시킨다.
- now와 num이 같아질때 까지 num을 이동한다.
- now가 num보다 큰 경우 num이 아래의 줄로 가도록 +3 해준다.
- now가 num보다 작은 경우 num이 위의 줄로 가도록 -3 해준다.
- 누르고자 하는 번호와 현재 왼쪽/오른쪽 손이 누르고 있는 번호의 위치 사이의 거리를 측정하기 위해 distance 함수를 사용한다.
#include <string>
#include <vector>
using namespace std;
int distance(int num, int now, string hand){
int cnt=0;
if(now!=2 && now!=5 && now!=8 && now!=11){
if(hand=="R"){
num++;
} else{
num--;
}
cnt++;
}
while(1){
if(now==num){
break;
} else if(now>num){
num+=3;
} else{
num-=3;
}
cnt++;
}
return cnt;
}
string solution(vector<int> numbers, string hand) {
string answer = "";
int l=10, r=12;
for(int i=0; i<numbers.size(); i++){
int num=numbers[i];
if(num==0){
num=11;
}
if(num==1 || num==4 || num==7){
answer+="L";
l=num;
} else if(num==3 || num==6 || num==9){
answer+="R";
r=num;
} else{
if(distance(num, l, "L")>distance(num, r, "R")){
answer+="R";
r=num;
} else if(distance(num, l, "L")<distance(num, r, "R")){
answer+="L";
l=num;
} else{
if(hand=="right"){
answer+="R";
r=num;
} else{
answer+="L";
l=num;
}
}
}
}
return answer;
}
다른 사람 풀이
전체적으로 푸는 흐름은 같으나,
번호가 있는 줄의 위치를 해당 번호를 3으로 나누어 생기는 나머지를 통해 파악하였으며
위의 distance 함수를 수식화 하여 풀었다.
- 누르는 번호가
- 1, 4, 7 -> 3으로 나누면 나머지가 1이면 L
- 3, 6, 9 -> 3으로 나누면 나머지가 0이면 R
- 이외에는 현재 왼손이 누르고 있는 번호의 위치와 오른손이 누르고 있는 번호의 위치를 통해 더 가까운 손으로 누른다. 거리가 같은 경우 왼손잡이면 왼손으로 오른손잡이면 오른손으로 누른다.
- 누르고자 하는 번호와 현재 왼쪽/오른쪽 손이 누르고 있는 번호의 위치 사이의 거리를 측정하기 위해 다음과 같은 식을 사용한다.
- 누르고자 하는 번호와 현재 왼쪽/오른쪽 손이 누르고 있는 번호의 위치 사이의 거리를 측정하기 위해 다음과 같은 식을 사용한다.
if(curr_L % 3 == 1) dist_L = abs(tmp - curr_L - 1) / 3 + 1;
else dist_L = abs(tmp - curr_L) / 3;
if(curr_R % 3 == 0) dist_R= abs(tmp - curr_R + 1) / 3 + 1;
else dist_R = abs(tmp - curr_R) / 3;
#include <string>
#include <vector>
#include <math.h>
using namespace std;
string solution(vector<int> numbers, string hand) {
string answer = "";
int curr_L = 10;
int curr_R = 12;
for(int i = 0; i < numbers.size(); i++) {
if(numbers[i] % 3 == 1) {
answer += "L";
curr_L = numbers[i];
}
else if(numbers[i] % 3 == 0 && numbers[i] != 0) {
answer += "R";
curr_R = numbers[i];
}
else {
int tmp = numbers[i];
if(numbers[i] == 0) tmp = 11;
int dist_L, dist_R;
if(curr_L % 3 == 1) dist_L = abs(tmp - curr_L - 1) / 3 + 1;
else dist_L = abs(tmp - curr_L) / 3;
if(curr_R % 3 == 0) dist_R= abs(tmp - curr_R + 1) / 3 + 1;
else dist_R = abs(tmp - curr_R) / 3;
if(dist_L == dist_R) {
if(hand[0] == 'l') {
answer += "L";
curr_L = tmp;
}
else {
answer += "R";
curr_R = tmp;
}
}
else {
if(dist_L < dist_R) {
answer += "L";
curr_L = tmp;
}
else {
answer += "R";
curr_R = tmp;
}
}
}
}
return answer;
}
'알고리즘' 카테고리의 다른 글
[프로그래머스/c++] 신규 아이디 추천 (0) | 2022.08.24 |
---|---|
[프로그래머스/c++] 숫자 문자열과 영단어 (0) | 2022.08.24 |
[프로그래머스/c++] 크레인 인형뽑기 게임 (0) | 2022.08.24 |
[프로그래머스/c++] 소수 만들기 (0) | 2022.08.19 |
[프로그래머스/c++] 폰켓몬 (0) | 2022.08.18 |