[프로그래머스] 조이스틱

임윤희·2024년 10월 12일

조이스틱

🔍 알고리즘 분류

  • 그리디

💡 문제 풀이

  1. 위아래 최소 조작: min(name[L1] - 'A','Z' - name[L1] +1)
  2. 좌우 최소 조작
    1) 정방향 이동 후 역방향으로 턴하는 경우
    2) 역방향 이동 후 정방향으로 턴하는 경우
    => 위 두 경우 중 최솟값 선택

📄 코드

  • C++
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>

#define min(a,b) ((a) > (b) ? (b) : (a))
using namespace std;

int solution(string name) {
    int answer = 0;
    int L2 = 0;
    int move = name.size() - 1;
    int length = name.size();

    // 턴 지점 바꿔가며 진행
    for(int L1=0; L1 < name.size();L1++) { 
        // 위아래 최소 조작
        answer += min(name[L1] - 'A','Z' - name[L1] +1);        
        
        int L2_idx = L1+1;
        while(L2_idx < length) {
            if(name[L2_idx] == 'A') L2_idx++;
            else break;
        }
        L2 = length - L2_idx;
        // 좌우 최소 조작
        move = min(move, L1 + L2 + min(L1, L2));    
    }
    return answer + move;
}

0개의 댓글