본문 바로가기
  • 소소한 개발자 이야기
Algorithm Study/Programmers

(2019 카카오 인턴십) 키패드 누르기

by Siwan_Min 2020. 7. 29.
728x90

 

 

코딩테스트 연습 - 키패드 누르기

[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

 

어려운 문제는 아닌거 같아요
문제 읽으시고 노트에 설계부터 제대로 하신 뒤에 코딩하면 됩니다. 

간단하게 문제 설명 드리자면 이렇습니다. 

위와 같이 키패드가 있고 n개의 숫자가 vector함수에 주어진다.

그 키패드를 순서대로 누를 때

1) 왼쪽 라인에 있는 숫자는 왼손으로 오론쪽 라인에 있는 숫자는 오른손

2) 가운데 숫자는 더 가까운 손으로 누른다.

3) 눌러야 할 숫자로부터 거리가 왼손, 오른손 모두 같으면 자주 쓰는 손으로 누른다. 

 

이 때, 처음부터 끝까지 각 번호를 어떤 손으로 눌렀는지 출력하라 

 

라는 문제입니다. (자세한 내용은 문제 링크를 통해서 확인해 주세요)

 

코드와 문제 풀이 방법은 아래와 같습니다

 

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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*
문제 해결 방안:
0 ~ 9 까지 각 숫자의 Y값과 X 값을 배열에 받는다. 
만약 눌러야 하는 숫자가 
    >> 1 4 7 이면 문자열에 'L' 을 추가 해준다.
    >> 3 6 9 이면 문자열에 'R' 을 추가 해준다. 
 
그게 아니면 눌러야 하는 숫자의 위치가 
    >> 왼손과 가까우면 'L'
    >> 오른손과 가까우면 'R'
 
    만약 거리가 같다면 주로 사용하는 손을 더해준다. 
 
사용한 손의 위치를 바꿔준다. 
*/
 
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
 
using namespace std;
 
struct p {
    int y;
    int x;
};
 
p curLeft, curRight;
p keypad[13];
 
//현재 손 위치 변경 
void nextLocation(char usedHand, int num ){
 
    // 오른손으로 버튼을 눌렀다면,
    if (usedHand == 'R'){
        curRight.y = keypad[num].y;
        curRight.x = keypad[num].x;
    }
    else { //왼손으로 버튼을 눌렀다면 
        curLeft.y = keypad[num].y;
        curLeft.x = keypad[num].x;
    }
}
 
string solution(vector<int> numbers, string hand) {
    string answer = "";
 
    int num = 1
    //각 숫자가 같는 위치의 좌표값을 구조체 배열에 받는다. 
    for(int i = 0; i < 4; i ++){
        for(int j = 0; j < 3; j++){
            keypad[num].y = i;
            keypad[num].x = j;
            num++;
        }
    }
    
    // 초기 위치 설정
    curLeft.y = 3, curLeft.x = 0;
    curRight.y = 3, curRight.x = 2;
    
    for(int i = 0; i < numbers.size(); i++){
        
        if (numbers[i] == 0) numbers[i] = 11;
        //왼손 사용의 경우
        if(numbers[i] == 1 ||
           numbers[i] == 4 ||
           numbers[i] == 7
          ){
            answer += 'L';
            nextLocation('L', numbers[i]);
        }
        // 오른손 사용의 경우 
        else if(numbers[i] == 3 ||
               numbers[i] == 6 ||
               numbers[i] == 9
               ){
            answer += 'R';
            nextLocation('R', numbers[i]);
        }
        // 키패드 가운데 라인의 경우
        else{
            //눌러야 할 번호의 좌표를 구한다.
            int numY = keypad[numbers[i]].y;
            int numX = keypad[numbers[i]].x;
           
           // 눌러야 할 버튼을 기준으로 왼손과 오른손의 거리를 구한다.
            int LeftDist = abs(curLeft.y - numY) + abs(curLeft.x - numX);
            int RightDist = abs(curRight.y - numY) + abs(curRight.x - numX);
            // 왼손이 더 가깝다면
            if( LeftDist < RightDist ){ 
                answer += 'L';
                nextLocation('L', numbers[i]);
                }
             //오른손이 더 가깝다면   
            else if (LeftDist > RightDist) {
                answer += 'R';
                nextLocation('R', numbers[i]);
                }
 
            //거리가 똑같을 경우    
            else {
                if (hand == "right") {
                    answer += 'R';
                    nextLocation('R', numbers[i]);
                    }
                else {
                    answer += 'L';
                    nextLocation('L', numbers[i]);
                }
            }
        }
    }
    return answer;
}
// int main(){
 
//     string hand = "right";
//     vector<int> numbers;
//     numbers.push_back(1);
//     numbers.push_back(3);
//     numbers.push_back(4);
//     numbers.push_back(5);
//     numbers.push_back(8);
//     numbers.push_back(2);
//     numbers.push_back(1);
//     numbers.push_back(4);
//     numbers.push_back(5);
//     numbers.push_back(9);
//     numbers.push_back(5);
 
//  //   cout<< "LRLLLRLLRRL"<<endl;
//     cout<< solution(numbers, hand);
 
//   // answer LRLLLRLLRRL
 
//     return 0;
// }

 

그럼 20000~~

728x90

댓글