문제
https://school.programmers.co.kr/learn/courses/30/lessons/67256
풀이
💡 규칙
- 1, 4, 7: 왼손
- 3, 6, 9: 오른손
- 2, 5, 8, 0: 거리 계산(더 가까운 쪽)
💡 거리 계산
- 키 변환: *: 11 / 0: 12 / #: 13
1 2 3 1 2 3
4 5 6 → 4 5 6
7 8 9 7 8 9
* 0 # 11 12 13 - 한 칸 이동 시 좌우 이동: -1, +1 / 상하 이동: -3, +3 로 계산 가능
좌우: (눌러야 하는 키 값과 현재 키의 차이) % 3
상하: (눌러야 하는 키 값과 현재 키의 차이) / 3
(ex) 2 → 6
차이: 4 = 우 1칸, 하 1칸 (1 + 3) - 왼손과의 거리 & 오른손과의 거리 비교 후 더 작은 값에 따라 손 결정
거리가 같을 경우 오른손잡이, 왼손잡이에 따라 결정
코드
#include <iostream>
#include <vector>
using namespace std;
string solution(vector<int> numbers, string hand) {
string answer = "";
int l_hand = 10, r_hand = 12; // 왼손: *, 오른손: # 에서 시작
for (int key: numbers) {
if (key == 1 || key == 4 || key == 7) { // 왼손
l_hand = key;
answer += 'L';
} else if (key == 3 || key == 6 || key == 9) { // 오른손
r_hand = key;
answer += 'R';
} else { // 거리 계산
if (key == 0) { // 0은 11로 계산
key = 11;
}
// 상하 좌우
int l_distance = abs(key - l_hand) / 3 + abs(key - l_hand) % 3;
int r_distance = abs(key - r_hand) / 3 + abs(key - r_hand) % 3;
if (l_distance < r_distance) { // 왼손이 더 가까움
l_hand = key;
answer += 'L';
} else if (l_distance > r_distance) { // 오른손이 더 가까움
r_hand = key;
answer += 'R';
} else { // 왼손, 오른손 거리 같음
if (hand == "right") {
r_hand = key;
answer += 'R';
} else {
l_hand = key;
answer += 'L';
}
}
}
}
return answer;
}
'💭 Problem Solving' 카테고리의 다른 글
[프로그래머스][C++] 타겟 넘버 (0) | 2024.05.31 |
---|---|
[프로그래머스][C++] 스킬트리 (0) | 2024.05.31 |
[BOJ][C++] 백준 20546번: 🐜 기적의 매매법 🐜 (0) | 2024.05.26 |
[프로그래머스][C++] 체육복 (0) | 2024.05.24 |
[BOJ][C++] 백준 1212번: 8진수 2진수 (0) | 2024.05.24 |