프로그래밍응용/오답노트
프로그래머스, 카카오 인턴, 키패드 누르기(C++, Python)
photoner
2021. 2. 28. 17:35
728x90
반응형
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
모든 문제 출처는 위의 프로그래머스다 ㅋ
문제 설명
스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.
이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.
맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
- 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
- 왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때는 왼손 엄지손가락을 사용합니다.
- 오른쪽 열의 3개의 숫자 3, 6, 9를 입력할 때는 오른손 엄지손가락을 사용합니다.
- 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.
4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.
순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.
[제한사항]
- numbers 배열의 크기는 1 이상 1,000 이하입니다.
- numbers 배열 원소의 값은 0 이상 9 이하인 정수입니다.
- hand는 "left" 또는 "right" 입니다.
- "left"는 왼손잡이, "right"는 오른손잡이를 의미합니다.
- 왼손 엄지손가락을 사용한 경우는 L, 오른손 엄지손가락을 사용한 경우는 R을 순서대로 이어붙여 문자열 형태로 return 해주세요.
[ 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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string solution(vector<int> numbers, string hand) {
string answer = "";
vector<int> left_numbers({ 1, 4, 7, -1 }); // 왼쪽 사이드 버튼들로 여기 버튼들은 무조건 왼손으로만 누른다.
vector<int> right_numbers({ 3, 6, 9, -2 }); // 오른쪽 사이트 버튼들로 여기 버튼들은 무조건 오른손으로만 누른다.
vector<int> mid_numbers({ 2, 5, 8, 0 }); // 가운데 사이드 버튼들로 누르기 위해 거리를 계산해야하는 버튼들.
int last_left_finger = -1, last_right_finger = -2; // 직전에 각 손이 누른 번호를 기록. -> 직전 버튼과 현재 버튼 사이에 거리를 구해야하기 때문
bool last_left_flag = true, last_right_flag = true;
// 각손의 직전에 누른 버튼이 각 사이드를 눌렀는지 여부. -> 사이드를 눌렀을 때와 가운데 사이드를 눌렀을 때의 거리 계산이 다르기 때문에 식별해야함.
int left_distance = 0, right_distance = 0; // 왼손과의 거리, 오른손과의 거리
for(auto now_number : numbers) // 누른 번호들을 하나씩 순회하면서
{
if(find(left_numbers.begin(), left_numbers.end(), now_number) != left_numbers.end()) // 왼쪽 사이드에 있는 번호라면
{
answer += "L"; // 답을 작성
last_left_finger = now_number; // 직전 누른 번호를 갱신
last_left_flag = true; // 사이드 번호를 눌렀으니 true로 갱신
}
else if(find(right_numbers.begin(), right_numbers.end(), now_number) != right_numbers.end())
{
answer += "R"; // 답을 작성
last_right_finger = now_number; // 직전 누른 번호를 갱신
last_right_flag = true; // 사이드 번호를 눌렀으니 true로 갱신
}
else // 만약에 현재 누른 버튼이 가운데 사이드라면 직전에 눌린
{
if(last_left_flag == false) // 왼손이 마지막으로 눌렀던 번호가 가운데 사이드의 버튼을 눌렀다면
{ // 단순 인덱스 차 계산을 진행한다.
left_distance = find(mid_numbers.begin(), mid_numbers.end(), last_left_finger) - find(mid_numbers.begin(), mid_numbers.end(), now_number);
left_distance = (left_distance<0)? left_distance * -1 : left_distance;
}
if(last_right_flag == false) // 오른손이 마지막으로 눌렀던 번호가 가운데 사이드의 버튼을 눌렀다면
{ // 단순 인덱스 차 계산을 진행한다.
right_distance = find(mid_numbers.begin(), mid_numbers.end(), last_right_finger) - find(mid_numbers.begin(), mid_numbers.end(), now_number);
right_distance = (right_distance<0)? right_distance * -1 : right_distance;
}
if(last_left_flag == true) // 왼손이 마지막으로 눌렀던 번호가 왼쪽 사이드의 버튼을 눌렀다면
{ // 현재 눌린 번호로부터 왼쪽 손의 왼쪽 사이드에서 직전에 누른 번호까지 거리를 구한다.
int idx = find(left_numbers.begin(), left_numbers.end(), last_left_finger) - left_numbers.begin();
for(int i=0; i<mid_numbers.size(); i++)
if( mid_numbers[i] == now_number )
left_distance = (idx - i < 0)? i-idx+1 : idx-i+1;
}
if(last_right_flag == true) // 오른손이 마지막으로 눌렀던 번호가 오른쪽 사이드의 버튼을 눌렀다면
{ // 현재 눌린 번호로부터 오른쪽 손의 오른쪽 사이드에서 직전에 누른 번호까지 거리를 구한다.
int idx = find(right_numbers.begin(), right_numbers.end(), last_right_finger) - right_numbers.begin();
for(int i=0; i<mid_numbers.size(); i++)
if( mid_numbers[i] == now_number )
right_distance = (idx - i < 0)? i-idx+1 : idx-i+1;
}
// 아래부터는 거리를 계산하여 가까운 쪽 손으로 처리를 하되, 거리가 같은 경우에는 main손?으로 처리한다.
if(left_distance < right_distance)
{
last_left_flag = false;
last_left_finger = now_number;
answer += "L";
}
else if(left_distance > right_distance)
{
last_right_flag = false;
last_right_finger = now_number;
answer += "R";
}
else if(left_distance == right_distance)
{
if(hand == "left")
{
last_left_flag = false;
last_left_finger = now_number;
answer += "L";
}
else if(hand == "right")
{
last_right_flag = false;
last_right_finger = now_number;
answer += "R";
}
}
}
}
return answer;
}
|
cs |
[ Python ]
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
def solution(numbers, hand):
answer = ''
left_side = [ 1, 4, 7, -1 ]
right_side = [ 3, 6, 9, -2 ]
mid_side = [ 2, 5, 8, 0 ]
last_left_val = -1
last_right_val = -2
for i in numbers:
if i in left_side: # i가 왼쪽 사이드인 경우 -> 왼손으로 그냥 누르면 됨.
answer += 'L'
last_left_val = i
elif i in right_side: # i가 오른쪽 사이드인 경우 -> 오른손으로 그냥 누르면 됨.
answer += 'R'
last_right_val = i
else: # i가 가운데 사이드인 경우 -> 경우마다 거리를 계산해야 함.
if last_left_val in mid_side: # 왼손 마지막이 가운데 줄에 있으면 -> 단순 계산
left_dist = mid_side.index(i) - mid_side.index(last_left_val)
left_dist = (lambda n: n*-1 if n<0 else n)(left_dist)
if last_right_val in mid_side: # 오른손 마지막이 가운데 줄에 있으면 -> 단순 계산
right_dist = mid_side.index(i) - mid_side.index(last_right_val)
right_dist = (lambda n: n*-1 if n<0 else n)(right_dist)
if last_left_val in left_side: # 왼손 마지막이 왼쪽 줄에 있으면 -> 거리 구함
left_dist = abs(left_side.index(last_left_val) - mid_side.index(i)) + 1
if last_right_val in right_side: # 오른손 마지막이 오른쪽 줄에 있으면 -> 거리 구함
right_dist = abs(right_side.index(last_right_val) - mid_side.index(i)) + 1
# 거리 비교 후, 처리
if left_dist < right_dist:
answer += 'L'
last_left_val = i
elif left_dist > right_dist:
answer += 'R'
last_right_val = i
else:
if hand == "left":
answer += 'L'
last_left_val = i
elif hand == "right":
answer += 'R'
last_right_val = i
return answer
|
cs |
같은 논리로 작성된 코드인데 파이썬이 압도적으로 짧다..
C++에서는 find 함수의 사용법이나 활용법, 차이를 통해 인덱스 차이를 구할수 있는 부분 등을 확인하면 되고, Python에서는 index 함수(없을 경우에는 에러가 나기 때문에 확실히 존재하는 값일 경우 인덱스를 구하기 위해 사용), in 절, 람다 함수, abs 함수 사용법을 보고 넘어가면 될 것이다.
728x90
반응형