프로그래머스 - 67256 키패드 누르기
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
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/
2020 카카오 인턴십 for Tech developers 문제해설
2020년 카카오의 여름 인턴십이 시작 되었습니다.여름 인턴십의 첫번째 관문인 코딩 테스트가 2020년 5월 9일 오후 2시부터 6시까지 진행되었는데요, 온라인으로 진행되었기 때문에 코로나19로부터
tech.kakao.com
(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
'개발 > 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 (1) | 2020.08.12 |
[C++, Python] 카카오 2020 인턴쉽 코딩테스트 - 수식 최대화 (0) | 2020.08.04 |