조이스틱

NJW·2022년 4월 4일
0

코테

목록 보기
29/170

들어가는 말

A로만 이루어진 문자에서 주어진 문자만큼 바꾸는 거다. 이때 조이스틱을 최소한으로 움직여야 한다.

알파벳 바꾸는 횟수를 구하는 건 그리 어렵지 않았다. 나는 M을 기준으로 두고 M보다 아스키코드가 작으면 name[i] - 65를 M보다 크면 91(Z의 아스키 코드가 90이다) - nmae[i]을 해줬다.

그러나 문제가 있었으니 바로 조이스틱을 좌우로 움직이는 거다. 도저히 생각해도 모르겠... 모르겠어서 다른 블로그를 참고했다.

블로그에서 좌우 횟수를 구하는 방법은 꽤 일관됐는데 바로 min()을 이용하는 거다. 만일 현재 알파벳이 A면 while문을 돌려서 A의 길이를 전부 구해주고 왼쪽으로 움직일 수와 오른쪽으로 움직일 수를 구해줘서 min을 이용하는 거다.

뭐... 그렇게 됐다.

코드 설명

name을 처음부터 끝가지 돌려주는데, 여기에는 세 가지 조건이 있다.

일단 현재 알파펫이 A인 경우. 현재 알파벳이 A라면 따로 알파벳을 바꿔줄 필요는 없다. 다만, 커서를 어떻게 움직이는 지만 구하면 된다. target에 현재 위치를 넣어주고 while문을 돌리면서 A가 어디까지 잇는지 구해준다. 그리고 왼쪽으로 움직이는 경우와 오른쪽으로 움직이는 경우를 구해준다. 왼쪽으로 움직일 수 있는 횟수는(i가 0이 아닐 경우에만) i-1을 해준다(오른쪽으로 움직이는 것에 반대편). 오른쪽으로 움직일 수 있는 횟수는 전체의 길이에다가 A가 존재하는 길이를 빼주면 된다(A가 존재하는 길이를 빼주면 오른쪽으로 얼만큼 움직였을 때 A가 아닌 다른 알파벳이 나오는지 알 수 있다). 마지막으로 min을 이용해준다. left와 right의 최소값에다가 left와 right을 더해서 joy와의 최소값을 구해주면 된다.

만일 현재의 알파벳이 M보다 작거나 같을 경우 name[i] - 65를 해서 상하 횟수를 구해준다. M보다 클 경우 91 - name[i]를 해서 상하 횟수를 구한다.

이렇게 구한 answer에다가 joy를 더해주면 전체 움직인 횟수가 나온다.

코드

#include <string>
#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

int solution(string name) {
    int answer = 0;
    int joy = name.length()-1;
   
    /*m까지. m보다 작은 수면 다음 알파벳으로 돌아가면 되고 m보다 큰 수면 이전 알파벳으로 가야 한다.*/
    for(int i=0; i<name.length(); i++){
        if(name[i] == 65){
            int target = i;
            while(target < name.length() && name[target] == 'A'){
                target += 1;
            }
            int left = i == 0 ? 0 : i-1;
            int right = name.length() - target;
            joy = min(joy, left + right + min(left, right));
            continue;
        }else if(name[i] <= 77){
            answer += (name[i] - 65);
        }else{
            answer += (91 - name[i]);
        }
    }
    answer += joy;
    return answer;
}

참고

https://unglog.tistory.com/8

profile
https://jiwonna52.tistory.com/

0개의 댓글