오답노트

프로그래머스 2단계 - 조이스틱 - 오답노트 본문

C,C++/코딩테스트

프로그래머스 2단계 - 조이스틱 - 오답노트

권멋져 2022. 6. 5. 17:34
https://programmers.co.kr/learn/courses/30/lessons/42860?language=cpp# 
 

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

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

programmers.co.kr

- 문제 파악

조이스틱으로 알파벳 이름을 만들려고한다. 맨 처음에는 A로만 이루어져 있고 조이스틱의 규칙은 다음과 같다.

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

이 때 주어진 알파벳 이름을 만드는 조이스틱의 최소 횟수를 출력하라.

 

- 나의 접근

1차원적으로 생각했을 때, 커서를 왼쪽 또는 오른쪽으로만 이동할 것이라고 생각했다.

하지만 정답에서와 같이 왼쪽 또는 오른쪽으로 이동했다가 다시 원점으로 돌아와서 이전 방향의 반대 방향으로 움직이는 경우도 있었다.

 

- 정답

아래 코드와 다르게 내 방식으로 구현한 코드는 기본적으로 주어지는 첫번째 테스트 케이스(모든 문자가 A가 아닌경우)를 통과 하지 못했다.

 

아래 코드는

1. 모든 문자에 커서가 가는 경우

2. 처음부터 현재 문자까지 갔다가 원점을 돌아 마지막 문자부터 A가 아닌 마지막 문자까지 가는 경우

3. 마지막 문자부터 A가 아닌 마지막 문자까지 갔다가 원점을 돌아  처음부터 현재 문자까지 가는 경우

 

이 세가지 경우를 한 개의 반복문에서 처리하였다.

 

#include "bits/stdc++.h"

using namespace std;

int solution(string name) {
    int answer = 0;

    int n = name.size();
    int turn = n-1;
    int max_pos;
    
    for (int i = 0; i < n; i++)
    {
        char a = name[i];
        int ntmp0 = a - 'A';
        int ntmp1 = 'Z' - a + 1;

        int nMin = min(ntmp0, ntmp1);

        max_pos = i +1;
        while (max_pos < n && name[max_pos] == 'A') max_pos++;

        answer += nMin;
        turn = min(turn, i + n - max_pos + min(i, n - max_pos));

    }
    
    answer += turn;

    
    return answer;
}