본문 바로가기
알고리즘

[프로그래머스] 알고리즘 76일차 : 키패드 누르기

by SiO2whocode 2021. 2. 1.
반응형

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

C++ 2020 카카오 인턴십

위 사진 같은 키패드를 어느 손으로 누를건지를 차례로 출력하는 문제이다. 1,4,7이랑 3,6,9는 누르는 손이 정해져있는데

문제는 가운데이다. 왼손과 오른손 중에 현재 상태에서 가장 가까운 손으로 누른다. 거리가 같으면 오른손잡이면 오른손으로 왼손잡이면 왼손으로 누른다.

 

접근방법

처음에 일단 1,4,7이랑 3,6,9부터 처리하는 코드를 쓰고 고민했다.

간단하게 풀어보려고 이것저것 생각해 봤는데 그냥 map써서 번호당 위치를 저장해서

현재 손의 위치랑 거리를 구해서 비교하는게 가장 깔끔할 것 같았다.

map<int, vector<int>>를 썼다. *이랑 #도 처리해야해서 고민했는데 입력받는 int배열에 0~9의 정수만 있을 예정이라

초기위치만 *은 10, #은 12로 매핑해줬다.

map변수를 초기화하는 함수는 따로 구현했다.

번호가 2,5,8,0일때 해당하는 번호의 위치와 현재 두 손가락의 위치간의 거리를 계산해야하는데

여기서 제곱할 필요없고 절대값 쓰면 된다.

answer에 값 추가하고 현재 손가락 위치 갱신하는 부분이 계속 반복되긴하는데 두줄이라 그냥 놔뒀다.

 

오답노트

이번에도 실수 엄청 했는데

1. map 초기화 함수 정의 해두고 호출안함

다른 웬만한거 다 고쳤는데 계속 core dump가 떴다. 원인은 distance값에 아예 접근을 못하는 것이었는데

찍어보니 map변수에도 접근이 안됐다. 진짜 치명적이었던게

map초기화 함수 안에서 키패드의 번호를 옮겨야하는데 cnt값을 갱신을 안했던 것....휴^^...

서둘러서 cnt++해줬더니 잘됐다..

 

풀이 시간은 어제 조금 풀고 오늘 마저 풀긴했는데 오늘 푼 시간만 삽질하느라 1시간 조금 더 걸린듯

 

소스코드

#include <string>
#include <vector>
#include <map>
#include <cmath>
using namespace std;

map<int, vector<int>> position;
void positioning(){
    int cnt = 1;
    for(int r = 1 ; r <= 4 ; r++){
        for(int c = 1 ; c <= 3 ; c++){
            position[cnt++] = vector<int>{r,c};
        }
    }
    position[0] = vector<int>{4,2};
}
string solution(vector<int> numbers, string hand) {
    positioning();
    int currentL = 10;
    int currentR = 12;
    int distanceR, distanceL;
    string answer = "";
    for(int i = 0 ; i < numbers.size() ; i++){
        if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7){
            answer += "L";
            currentL = numbers[i];
        }else if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9){
            answer += "R";
            currentR = numbers[i];
        }else{
            distanceR = abs(position[currentR][0]-position[numbers[i]][0])+
                abs(position[currentR][1]-position[numbers[i]][1]);
            distanceL = abs(position[currentL][0]-position[numbers[i]][0])+
                abs(position[currentL][1]-position[numbers[i]][1]);
            if(distanceR > distanceL){
                answer += "L";
                currentL = numbers[i];
            }else if(distanceR < distanceL){
                answer += "R";
                currentR = numbers[i];
            }else{
                if(hand == "left"){
                    answer += "L";
                    currentL = numbers[i];
                }else{
                    answer += "R";
                    currentR = numbers[i];
                }
            } 
        }
    }
    return answer;
}
반응형

댓글0