티스토리 뷰

728x90

문제 설명

조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다.
ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA

조이스틱을 각 방향으로 움직이면 아래와 같습니다.

  • ▲ - 다음 알파벳
  • ▼ - 이전 알파벳 (A에서 아래쪽으로 이동하면 Z로)
  • ◀ - 커서를 왼쪽으로 이동 (첫 번째 위치에서 왼쪽으로 이동하면 마지막 문자에 커서)
  • ▶ - 커서를 오른쪽으로 이동

예를 들어 아래의 방법으로 JAZ를 만들 수 있습니다.

  1. 첫 번째 위치에서 조이스틱을 위로 9번 조작하여 J를 완성합니다.
  2. 조이스틱을 왼쪽으로 1번 조작하여 커서를 마지막 문자 위치로 이동시킵니다.
  3. 마지막 위치에서 조이스틱을 아래로 1번 조작하여 Z를 완성합니다. 따라서 11번 이동시켜 "JAZ"를 만들 수 있고, 이때가 최소 이동입니다.

만들고자 하는 이름 name이 매개변수로 주어질 때, 이름에 대해 조이스틱 조작 횟수의 최솟값을 return 하도록 solution 함수를 만드세요.

 

제한 조건

  • name은 알파벳 대문자로만 이루어져 있습니다.
  • name의 길이는 1 이상 20 이하입니다.

 

입출력 예

name return
"JEROEN" 56
"JAN" 23

 

 

코드

#include <string>
#include <vector>

using namespace std;

int solution(string name) {
    int answer = 0;
    int i;
    int j;
    int toleft;
    int toright;

    i = 0;
    while (1)
    {
        answer += min(name[i] - 'A', 'Z' - name[i] + 1);
        name[i] = 'A';

        j = i;
        toleft = 0;
        while (name[j] == 'A')
        {
            j--;
            if (j < 0)
                j += name.size();
            toleft++;
            if (toleft >= name.size())
                break;
        }

        if (toleft >= name.size())
            break;

        j = i;
        toright = 0;
        while (name[j] == 'A')
        {
            j++;
            if (j >= name.size())
                j -= name.size();
            toright++;
            if (toright >= name.size())
                break;
        }

        answer += min(toleft, toright);
        if (toleft < toright)
        {
            i -= toleft;
            if (i < 0)
                i += name.size();
        }
        else
        {
            i += toright;
            if (i >= name.size())
                i -= name.size();
        }
    }
    return answer;
}

 

이 문제는 탐욕법(Greedy) 알고리즘을 사용하는 문제이므로 각 상황에서 최적의 선택을 하도록 구현했다.

초기 이름은 'A'로만 구성된 문자열이다. 이것을 종료 조건으로 사용했다. name[i]에 해당하는 문자의 설정이 끝나면 'A'로 변경해 더 이상 검사하지 않도록 하고, 모든 문자가 'A'가 되면 반복을 종료한다.

먼저, 처음 위치인 i = 0에서 시작한다. 초기 설정인 문자 'A'에서 name[i]의 문자까지 조이스틱을 몇 번 조작해야 하는지 구한다. 위로 움직이는 경우의 조작 횟수와 아래로 움직이는 경우의 조작 횟수를 비교해 더 적은 값을 선택하여 answer에 더한다. 아래로 움직이는 경우에 +1을 해준 것은 'A'에서 'Z'로 가기 위한 조작 횟수를 의미한다.

이제 다음으로 설정할 문자의 위치를 구한다. 0부터 (name.size() - 1) 범위 내에서 인덱스를 조절하며 'A'가 아닌 가장 가까운 문자를 찾는다. 마찬가지로 왼쪽으로 움직이는 경우의 조작 횟수와 오른쪽으로 움직이는 경우의 조작 횟수를 비교해 더 적은 값을 선택하여 answer에 더한다. 조작 횟수가 (name.size() - 1) 보다 커지면 모든 문자가 'A'가 된 것이므로 반복을 종료하고 answer를 반환한다.

 

링크

programmers.co.kr/learn/courses/30/lessons/42860

 

코딩테스트 연습 - 조이스틱

조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다. ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA 조이스틱을 각 방향으로 움직이면 아래와 같습니다. ▲ - 다

programmers.co.kr

github.com/inbdni/Programmers/blob/master/level02/%EC%A1%B0%EC%9D%B4%EC%8A%A4%ED%8B%B1.cpp

 

inbdni/Programmers

Contribute to inbdni/Programmers development by creating an account on GitHub.

github.com

 

728x90
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
공지사항
링크
Total
Today
Yesterday