반응형
프로그래머스 - 67256 키패드 누르기
https://programmers.co.kr/learn/courses/30/lessons/67256
1. C++
#include <string>
#include <vector>
using namespace std;
string solution(vector < int > numbers, string hand) {
string answer = "";
int lft_pos = -1;
int rgt_pos = -1;
for (int i = 0; i < numbers.size(); i++) {
if ((numbers[i] == 1) || (numbers[i] == 4) || (numbers[i] == 7)) {
answer += "L";
lft_pos = numbers[i];
}
else if ((numbers[i] == 3) || (numbers[i] == 6) || (numbers[i] == 9)) {
answer += "R";
rgt_pos = numbers[i];
}
else {
int lft_dist = -1;
int rgt_dist = -1;
if (numbers[i] == 0) numbers[i] = 11;
if (lft_pos == -1) lft_dist = (12 - numbers[i]) / 3 + (12 - numbers[i]) % 3;
else lft_dist = (abs(lft_pos - numbers[i]) / 3) + (abs(lft_pos - numbers[i]) % 3);
if (rgt_pos == -1) rgt_dist = (12 - numbers[i]) / 3 + (12 - numbers[i]) % 3;
else {
rgt_dist = (abs(rgt_pos - numbers[i]) / 3) + (abs(rgt_pos - numbers[i]) % 3);
}
if (lft_dist > rgt_dist) {
answer += "R";
rgt_pos = numbers[i];
}
if (lft_dist < rgt_dist) {
answer += "L";
lft_pos = numbers[i];
}
if (lft_dist == rgt_dist) {
if (hand == "right") {
answer += "R";
rgt_pos = numbers[i];
}
else if (hand == "left") {
answer += "L";
lft_pos = numbers[i];
}
}
}
}
return answer;
}
2, 5, 8, 0 을 눌러야할 때는 더 가까운 손으로 눌러야한다
0이라면 11로 바꿔주고
|12- 왼손이 위치한 번호 와 누를 번호의 차 | / 3 + |12- 오른손이 위치한 번호 와 누를 번호의 차 | %3 을 하여 거리를 비교하였다.
카카오 해설을 보니 x, y 좌표를 나타내는 left_x, left_y, right_x, right_y 를 선언해 계산하였다.
그래서 파이썬은 이 방법으로 풀어보았다.
https://tech.kakao.com/2020/07/01/2020-internship-test/
(x, y) 좌표를 아래와 같다고 보고 풀었다
(1, 1) | (1, 2) | (1, 3) |
(2, 1) | (2, 2) | (2, 3) |
(3, 1) | (3, 2) | (3, 3) |
(4, 1) | (4, 2) | (4, 3) |
2. Python
def solution(numbers, hand):
#initialize
answer = ''
lft_x = 4; lft_y = 1
rgt_x = 4; rgt_y = 3
x = -1; y = -1
for n in numbers:
#왼손 혹은 오른손
if(n== 1 or n == 4 or n == 7):
answer += "L"
lft_x = n//3 + 1; lft_y = 1
elif (n== 3 or n == 6 or n == 9):
answer += "R"
rgt_x = n//3; rgt_y = 3
#가운데 줄 누르기
else:
if(n == 0) : x = 4
else: x = n//3 + 1
y = 2
lft_dist = abs(lft_x - x) + abs(lft_y - y)
rgt_dist = abs(rgt_x - x) + abs(rgt_y - y)
if(lft_dist > rgt_dist):
answer += "R"
rgt_x = x; rgt_y = y
elif(lft_dist < rgt_dist):
answer += "L"
lft_x = x; lft_y = y
else:
if(hand == "right"):
answer += "R"
rgt_x = x; rgt_y = y
elif(hand == "left"):
answer += "L"
lft_x = x; lft_y = y
return answer
728x90
반응형
'개발 > Algorithm 문제 풀이' 카테고리의 다른 글
[Python] 카카오 2020 인턴쉽 코딩테스트 - 보석쇼핑 (0) | 2020.08.15 |
---|---|
[C++, Python] 투 포인터 3) BOJ 1806 부분합 (0) | 2020.08.12 |
[C++, Python] 투 포인터 2) BOJ 1644 소수의 연속합 (0) | 2020.08.12 |
[C++] 투 포인터 1) BOJ 2003 수들의 합2 (0) | 2020.08.12 |
[C++, Python] 카카오 2020 인턴쉽 코딩테스트 - 수식 최대화 (0) | 2020.08.04 |