본문 바로가기

숨막히는 알고말고/문제 풀이

[Programmers] 조이스틱

👀 문제 설명

문제

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

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

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

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

 

제한 사항

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

입출력 예

name return
"JEROEN" 56
"JAN" 23

✍🏻풀이

처음 AAA로 시작하는 string 변수를 만든다. (변수이름 temp)

while문을 사용하여 각 자리에서 A쪽으로 이동하는게 가까운지, Z쪽으로 이동하는게 가까운지 비교하여 가까운 쪽으로 조이스틱을 움직인다.

answer에 이동한 값을 더해준다.

왼쪽 or 오른쪽 중 이동할 곳을 고를 때는 이동이 더 빠른 쪽으로 이동하고, answer에 이동횟수를 반영해준다.

temp와 name이 같으면 while문을 멈추고 answer을 return한다.

 

코드

//
//  Programmers_42860.cpp
//  Algorithm
//
//  Created by 조수민 on 2020/11/13.
//  Copyright © 2020 조수민. All rights reserved.
//
//  조이스틱(https://programmers.co.kr/learn/courses/30/lessons/42860)

#include <stdio.h>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

int solution(string name) {
    int answer = 0;
    
    int i = 0;
    string temp(name.length(), 'A'); // temp = AAA
    while (true) {
        temp[i] = name[i];
        
        // A쪽이 더 가까운지 Z쪽이 더 가까운지 비교하여 더 가까운 쪽을 answer에 더한다.
        name[i] - 'A' > 'Z' + 1 - name[i] ? answer += 'Z' + 1 - name[i] : answer += name[i] - 'A';
        
        if (temp == name) // name이 만들어졌으면 break
            break;
        
        // 왼쪽 or 오른쪽 둘 중 어디로 이동?
        for (int move = 1; move < name.length(); move++) {
            // 오른쪽 이동이 빠를 경우 오른쪽으로 이동하고 이동횟수 반영
            if (name[(i + move) % name.length()] != temp[(i + move) % name.length()]) {
                i = (i + move) % name.length();
                answer += move;
                
                break;
            }
            // 왼쪽 이동이 빠를 경우 왼쪽으로 이동하고 이동횟수 반영
            else if (name[(i + name.length() - move) % name.length()]
                     != temp[(i + name.length() - move) % name.length()]) {
                i = (i + name.length() - move) % name.length();
                answer += move;
                
                break;
            }
        }
    }
    
    return answer;
}

int main() {
    cout << solution("JEROEN") << endl;
    
    return 0;
}

'숨막히는 알고말고 > 문제 풀이' 카테고리의 다른 글

[Baekjoon] 행렬  (0) 2020.11.26
[Baekjoon] 빗물  (0) 2020.11.26
[Baekjoon] 단지번호붙이기(BOJ 2667)  (0) 2020.11.22
[Programmers] 체육복  (0) 2020.11.12
[Programmers] 카펫  (0) 2020.11.10