[Programmers/C++] 조이스틱

GamzaTori·2025년 2월 8일

Algorithm

목록 보기
129/133

시간 복잡도

  • for문이 최대 N번, while문은 전체적으로 N번 이기 때문에 O(N)O(N) 입니다
  • while문이 실행될 때마다 idx가 증가하면서 전체 문자열을 기준으로 한 번씩만 방분합니다.
  • 따라서 while문이 여러 번 중첩되어 실행되지 않고 최대 N번만 실행됩니다

문제 접근법

  • 임의의 문자 xx에서 A가 되는 경우는 두 가지 입니다.
    1. 'A' -> 'xx': 'xx' - 'A'
    2. 'A' -> 'Z' -> 'xx': 'Z'-'xx'+1
  • 현재 문자의 위치(ii)에서 다음 A가 아닌 문자의 위치(idxidx)를 구한 후 iiidxidx를 찍는 두 가지의 경우에서 최솟값을 선택합니다.

코드

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int solution(string name) {
    int answer = 0;
    int size = name.size();
    int turn = size - 1;
    for (int i = 0; i < size; i++) {
        answer += min(name[i] - 'A', 26 - (name[i] - 'A'));
        int idx = i + 1;
        while (idx < size && name[idx] == 'A')
            idx++;
        turn = min(turn, i + size - idx + min(i, size - idx));
    }
    answer += turn;
    return answer;
}
profile
게임 개발 공부중입니다.

0개의 댓글