티스토리 뷰
반응형
숫자 배열이 주어지는데
숫자 키패드에서 어느쪽 엄지손가락을 써서 배열의 숫자들을 눌렀을까 알아맞히는 문제
문제의 조건
1. 엄지손가락만 사용한다.
2. 왼쪽 엄지손가락은 *에서 시작하고 오른쪽 엄지손가락은 #에서 시작한다.
3. 왼쪽 엄지손가락은 1, 4, 7을 누를 수 있고
오른쪽 엄지손가락은 3, 6, 9를 누를 수 있다.
4. 가운데 라인에 있는 숫자들은 현재 손가락이 있는 위치에서 더 가까운 위치에 있는 손가락이 누른다.
-> 매번 숫자를 누를 때마다 손가락 위치를 저장해야 함
5. 거리 계산은 직선상으로만 하며 대각선으로는 하지 않음
-> 대각선 위치에 있으면 거리를 2라고 봄
6. 만약 양쪽 손가락 위치에서 눌러야 할 숫자까지 거리가 같으면 오른손잡이면 오른손으로 누르고 왼손잡이면 왼손으로 누른다.
어느 손잡이인지는 hand라는 이름을 가진 string 매개변수로 주어짐
왼손 = "left"
오른손 = "right"
#include <string>
#include <vector>
using namespace std;
//손가락과 숫자들의 키패드 상 좌표를 저장할 구조체
struct Pos
{
int x;
int y;
public:
//키패드간 거리 계산하는 함수
int GetDistance(Pos other)
{
int X = x - other.x;
if (0 > X) //음수가 나오면 비트연산으로 양수로 바꿔줌
X = ~X+1;
int Y = y - other.y;
if (0 > Y)
Y = ~Y+1;
return X+Y;
}
};
//입력받은 숫자에 따라 키패드상 좌표를 구해주는 함수
//2차원 배열 인덱스 기준으로 작성함
Pos GetPosOnDial(int num)
{
Pos FingerPos;
switch (num)
{
case 1:
FingerPos.x = 0;
FingerPos.y = 0;
break;
case 2:
FingerPos.x = 1;
FingerPos.y = 0;
break;
case 3:
FingerPos.x = 2;
FingerPos.y = 0;
break;
case 4:
FingerPos.x = 0;
FingerPos.y = 1;
break;
case 5:
FingerPos.x = 1;
FingerPos.y = 1;
break;
case 6:
FingerPos.x = 2;
FingerPos.y = 1;
break;
case 7:
FingerPos.x = 0;
FingerPos.y = 2;
break;
case 8:
FingerPos.x = 1;
FingerPos.y = 2;
break;
case 9:
FingerPos.x = 2;
FingerPos.y = 2;
break;
case 0:
FingerPos.x = 1;
FingerPos.y = 3;
break;
}
return FingerPos;
}
string solution(vector<int> numbers, string hand) {
string answer = "";
//가운데 라인 숫자들 좌표 저장
Pos Two = GetPosOnDial(2);
Pos Five = GetPosOnDial(5);
Pos Eight = GetPosOnDial(8);
Pos Zero = GetPosOnDial(0);
Pos LeftPos = {0,3};
Pos RightPos = {2,3};
int iDistFromLeft = 0;
int iDistFromRight = 0;
for (int i = 0; numbers.size() > i; i++)
{
if (1 == numbers[i] || 4 == numbers[i] || 7 == numbers[i])
{
answer += "L";
LeftPos = GetPosOnDial(numbers[i]);
}
else if (3 == numbers[i] || 6 == numbers[i] || 9 == numbers[i])
{
answer += "R";
RightPos = GetPosOnDial(numbers[i]);
}
else
{
Pos TmpPos;
switch (numbers[i])
{
case 2:
TmpPos = Two;
break;
case 5:
TmpPos = Five;
break;
case 8:
TmpPos = Eight;
break;
case 0:
TmpPos = Zero;
break;
}
//양쪽 손가락으로부터의 거리를 구한 후 구한 값을 바탕으로 손가락 결정
iDistFromLeft = TmpPos.GetDistance(LeftPos);
iDistFromRight = TmpPos.GetDistance(RightPos);
if (iDistFromLeft < iDistFromRight)
{
answer += "L";
LeftPos = GetPosOnDial(numbers[i]);
}
else if (iDistFromLeft > iDistFromRight)
{
answer += "R";
RightPos = GetPosOnDial(numbers[i]);
}
else
{
if ("right" == hand)
{
answer += "R";
RightPos = GetPosOnDial(numbers[i]);
}
else if ("left" == hand)
{
answer += "L";
LeftPos = GetPosOnDial(numbers[i]);
}
}
}
}
return answer;
}
깔끔하지는 않지만...
언젠가 더 깔끔하게 작성할 수 있게 되기를 바라며...
반응형
'알고리즘 문제 풀이' 카테고리의 다른 글
[C++] 프로그래머스 없는 숫자 더하기 풀이 (0) | 2021.09.24 |
---|---|
[C++] 프로그래머스 크레인 인형뽑기 게임 풀이 (0) | 2021.09.23 |
[C++] HackerRank 해커랭크 Time Conversion 풀이 (0) | 2021.09.12 |
[C++] HackerRank 해커랭크 Left Rotation 풀이 (0) | 2021.09.11 |
[C++] HackerRank 해커랭크 Dynamic Array 풀이 (0) | 2021.09.11 |
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 스위프트플레이그라운드
- dp
- 영어공부
- 다이나믹프로그래밍
- greedy
- 알고리즘
- 애플
- 프로그래머스
- BFS
- hackerrank
- 코딩공부
- 너비우선탐색
- 문제풀이
- 아이패드
- 컴퓨터
- 백준
- c언어
- 깊이우선탐색
- 프로그래밍
- 해커랭크
- 컴퓨터사이언스
- 하드웨어
- c++
- 기초
- 캐나다
- 캐나다생활
- DFS
- 컴퓨터공부
- 그리디
- C언어기초
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함