일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- 멀티프로세서
- 병행성 관련 오류
- 파일시스템 구현
- 락
- DirectX12
- 그리디알고리즘
- 렌더링 파이프라인
- 다이나믹 프로그래밍
- 프로그래머스
- 디자인패턴
- 병행성
- Direct12
- 영속성
- 그리디 알고리즘
- 스케줄링
- 멀티쓰레드
- OS
- DirectX 12
- directx
- 백준
- 알고리즘
- 동적계획법
- 컨디션 변수
- 자료구조
- I/O장치
- 다이나믹프로그래밍
- 타입 객체
- codility
- 운영체제
- 쓰레드
Archives
- Today
- Total
기록공간
키패드 누르기 (2020 카카오 인턴쉽) 본문
반응형
해결 방법
특별한 알고리즘을 사용하지 않고 정직하게 푸는 문제였다. 우선 문제를 간단하게 정리해보겠다.
-
왼쪽 손가락은 '*' 위치에서, 오른쪽 손가락은 '#' 위치에서 시작한다.
-
키패드를 누르기 위해 손가락은 상하좌우로 1칸씩 움직이며 이동한다.
-
1, 4, 7 키패드는 왼쪽 손가락이 누른다.
-
3, 6, 9 키패드는 오른쪽 손가락이 누른다.
-
2, 5, 8, 0 키패드는 왼쪽과 오른쪽 손가락 중 가장 가까운 거리의 손가락이 누른다.
-
만약 왼쪽 오른쪽 손가락이 키패드와의 거리가 같다면 손잡이 위치에 따라 결정된다.
우선 손가락에서 키패드까지의 거리를 알기 위해서는 각 키패드의 위치를 지정해 주어야 한다. 위치는 pair<int, int>를 사용하여 각각 x축 y축으로 사용하였다.
위치를 지정해 주었다면 이제 거리를 구하는 함수가 필요하다. 손가락과 키패드 위치에서 x축과 y축의 차이를 합해주면 사이의 거리를 도출할 수 있다.
3, 6, 9와 1, 4, 7은 그냥 처리해주면 되고 2, 5, 8, 0이 되었을때 거리를 비교하여 처리해주면 된다.
만약 거리가 서로 같다면 같이 외부에서 입력받은 hand값을 비교해서 두 거리중 하나를 증가시켜 비교 할 수 있도록 한다.
left거리 = 4 right거리 = 4 로 같을 경우
* hand가 left라면 => right거리 + 1 => left거리가 더 가까우므로 left손가락을 사용하게 됨
* hand가 right라면 => left거리 + 1 => right거리가 더 가까우므로 right손가락을 사용하게 됨
구현 코드는 다음과 같다.
#include <string>
#include <vector>
using namespace std;
#define ASTERISK 10 // 별
#define SHARP 11 // 우물정자
// 절대값을 구해준다
int abs(int i) {
return (i < 0) ? -i : i;
}
// 거리를 구해준다
int calcDist(pair<int, int> curPos, pair<int,int> numPos) {
return abs(numPos.first - curPos.first) + abs(numPos.second - curPos.second);
}
string solution(vector<int> numbers, string hand) {
string answer = "";
vector<pair<int, int>> pos(12); // 위치값을 할당받고 설정해줌
int idx = 0;
pos[idx++] = make_pair(3, 1);
for(int i = 0; i < 4; ++i) {
for(int j = 0; j < 3; ++j) {
if(i == 3 && j == 1) continue;
pos[idx++] = make_pair(i, j);
}
}
pair<int, int> hand_L = pos[ASTERISK];
pair<int, int> hand_R = pos[SHARP];
for(const auto num : numbers) {
// 2, 5, 8, 0 -> left or right
if(num == 0 || num % 3 == 2) {
int leftDist = calcDist(hand_L, pos[num]);
int rightDist = calcDist(hand_R, pos[num]);
// 서로 같을 경우 손잡이 방향에 따라 결정해준다.
if(leftDist == rightDist)
(hand == "left") ? ++rightDist : ++leftDist;
if(leftDist > rightDist) {
answer += 'R';
hand_R = pos[num];
} else {
answer += 'L';
hand_L = pos[num];
}
} // 1, 4, 7 -> left
else if(num % 3 == 1) {
answer += 'L';
hand_L = pos[num];
} // 3, 6, 9 -> right
else {
answer += 'R';
hand_R = pos[num];
}
}
return answer;
}
반응형
'Algorithm > 문제' 카테고리의 다른 글
소수 찾기 (프로그래머스) - Java (0) | 2020.08.22 |
---|---|
최대공약수와 최소공배수 (프로그래머스) - Java (0) | 2020.08.22 |
오픈채팅방 (프로그래머스) (0) | 2020.08.19 |
MinPerimeterRectangle (Codility) - Java (0) | 2020.08.18 |
CountFactors (Codility) (0) | 2020.08.11 |
Comments