쌓고 쌓다
[프로그래머스] 키패드 누르기 C++ 풀이 본문
https://programmers.co.kr/learn/courses/30/lessons/67256
코딩테스트 연습 - 키패드 누르기
[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] "right" "LRLLLRLLRRL" [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] "left" "LRLLRRLLLRR" [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] "right" "LLRLLRLLRL"
programmers.co.kr
전체 코드
#include <string>
#include <vector>
#include <cmath>
using namespace std;
string solution(vector<int> numbers, string hand) {
string answer = "";
int left = 10;
int right = 12;
for(int i=0;i<numbers.size();i++)
{
if(numbers[i]==1||numbers[i]==4||numbers[i]==7)
{
answer+="L";
left=numbers[i];
}
else if(numbers[i]==3||numbers[i]==6||numbers[i]==9)
{
answer+="R";
right=numbers[i];
}
else
{
if(numbers[i]==0)
numbers[i]=11;
int leftlen = abs(numbers[i]-left)/3 + abs(numbers[i]-left)%3;
int rightlen = abs(numbers[i]-right)/3 + abs(numbers[i]-right)%3;
if(leftlen<rightlen)
{
answer+="L";
left=numbers[i];
}
else if(leftlen>rightlen)
{
answer+="R";
right=numbers[i];
}
else
{
if(hand=="left")
{
answer+="L";
left=numbers[i];
}
else
{
answer+="R";
right=numbers[i];
}
}
}
}
return answer;
}
1, 4, 7은 무조건 left, 3, 6, 9는 right이다.
그 외 2, 5, 8, 0은 거리를 계산해야 한다.
거리는 아래의 식으로 계산이 가능하다.
abs(numbers[i]-left)/3 + abs(numbers[i]-left)%3;
예를 들어보겠다.
1에서 5까지의 거리를 계산해보자.
먼저, 키패드에서 상, 하로 이동할 때 숫자에 +3 또는 -3 한다면 이동이 가능하다.
5에서 3을 빼면 2로 위로 이동하는 것이고, 5에서 3을 더했더니 아래로 8번으로 이동이 된다.
좌, 우로 이동할 땐 +1 또는 -1을 한다면 이동이 가능하다.
5에서 1을 빼면 번호 4로 이동이 되고, 5에서 1을 더했더니 6으로 이동이 된다.
즉, 현재 번호에서 원하는 번호로 이동하기 위해
3과 1을 적절히 이용해 이동해야 한다는 것이다.
그래서 두 번호의 차이를 이용해 최소 거리를 구할 것이다.
abs(numbers[i]-left)/3 -> 현재 번호에서 상하로 몇 칸을 이동해야 도착하는가?
abs(numbers[i]-left)%3; -> 현재 번호에서 좌우로 몇 칸을 이동해야 도착하는가?
두 abs() 함수의 합이 이동해야 하는 칸 수이다.
이것을 비교해 원하는 번호로 이동하기 위해 가장 가까운 손을 찾을 수 있다.
처음 왼손과 오른손은 *(10번)과 #(12번)에 있다.
int left = 10;
int right = 12;
1, 5, 8, 0번 은 양손 중 가까운 손으로 눌려야 한다.
우리는 거리를 구할 때 번호의 숫자로 구했는데
0번 또한 *(10)과 #(12)처럼 적절한 수로 대체를 해야 한다.
9 다음 10(*), 11 , 12(#) 이니 당연히 0은 번호 11로 대체한다.
if(numbers[i]==0)
numbers[i]=11;
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 없는 숫자 더하기 C++ 풀이 (0) | 2022.06.27 |
---|---|
[프로그래머스] 크레인 인형뽑기 게임 C++ 풀이 (0) | 2022.06.27 |
[프로그래머스] 숫자 문자열과 영단어 C++ 풀이 (0) | 2022.06.25 |
[프로그래머스] 신규 아이디 추천 C++ 풀이 (0) | 2022.06.24 |
[프로그래머스] 로또의 최고 순위와 최저 순위 C++ 풀이 (0) | 2022.06.23 |