hyunjin

[level 1]키패드 누르기 , pair,abs 사용 본문

알고리즘 연습/프로그래머스

[level 1]키패드 누르기 , pair,abs 사용

_h.j 2020. 7. 6. 21:26
728x90

첫 번째 방법

#include <string>
#include <vector>
#include <iostream>
#include <cstdlib>

using namespace std;

string solution(vector<int> numbers, string hand) {
    string answer = "";
    int l=9,r=11;  
    for(int i = 0 ; i < numbers.size();i++){
        if(numbers[i] == 0) numbers[i] = 10;
        else numbers[i]--;
        
        if(numbers[i]%3==0){
            answer += "L";
            l = numbers[i];
        }
        else if(numbers[i]%3 == 2){
            answer += "R";
            r = numbers[i];
        }
        else{
            int h = numbers[i]/3;
            int tmp1 = abs(h - l/3) + (1 - (l%3));
            int tmp2 = abs(h - r/3) + ((r%3)-1);
  
            if(tmp1 < tmp2){
                answer += "L";
                l = numbers[i];
            }
            else if (tmp1 > tmp2){
                answer += "R";
                r = numbers[i];
            }
            else{
                 if(hand.compare("left")==0){
                    answer += "L";
                    l = numbers[i];
                }
                else{
                    answer += "R";
                    r = numbers[i];
                }
            }           
        }
    }
    return answer;
}

 

 

두 번째 방법

어차피 같은 흐름이지만 pair를 사용해보았다.

#include <string>
#include <vector>
#include <utility>
#include <cstdlib>

using namespace std;

int len_pair(pair<int,int> a, pair<int,int> b){
    return abs(a.first-b.first) + abs(a.second-b.second);
}
string solution(vector<int> numbers, string hand) {
    string answer = "";
    pair<int,int> l = make_pair(3,0),r= make_pair(3,2),t;
    for(int i = 0 ; i < numbers.size();i++){
       
        if(numbers[i] == 0 ) t= make_pair(3,1);
        else t = make_pair( (numbers[i]-1)/3 ,(numbers[i]-1)%3);
        
        if(t.second == 0){
            answer += "L";
            l = t;
        }
        else if(t.second == 2){
            answer += "R";
            r = t;
        }
        else{
            int len1 = len_pair(l,t);
            int len2 = len_pair(r,t);
            if(len1<len2){
                answer += "L";
                l = t;
            }
            else if(len1>len2){
                answer += "R";
                r = t;
            }
            else{
                if(hand.compare("left")==0){
                    answer += "L";
                    l = t;
                }
                else{
                    answer += "R";
                    r = t;
                }    
            }
        }        
    }
    return answer;
}

 

  • 문제 풀 때 기존의 숫자 패드는 열의 배열이 3으로 나눴을 때 1,2,0 순 => 계산 시 복잡해짐을 느껴서 바꿈
  • 전체적으로 1을 빼주고 (0,0)의 페어 형태로 표현해 계산했다 => 거리 계산 시 편함
  • 주의할 점은 거리 계산이 (x,y) 각 자리 차의 제곱의 합이 아닌 각 자리 차의 절댓값의 합으로 풀어야한다.
    • 문제에서 칸 이동을 1씩으로 잡았기 때문
  • abs 함수
    • 헤더 파일 : int 형 <cstdlib>, 이외 <cmath>

 

 

 

728x90