Post

Programmers_Greedy02 - 조이스틱

프로그래머스 - 조이스틱 문제 입니다.

1. 문제

https://programmers.co.kr/learn/courses/30/parts/12077


2. 분류 및 난이도

Programmers 문제입니다.
level 2의 문제입니다.


3. 생각한 것들(문제 접근 방법)

  • 두번째 인덱스가 A인경우만 검사해주면 되는 줄 알았습니다.
  • 테스트케이스 11에서 계속 틀려서 애를 많이 먹었습니다.
  • 보아하니 BBBAAAB같은 예제는 BBB간다음 되돌아가서 맨 끝을 B로 만들어주는게 최선의 정답인 경우가 있었습니다.
  • 다른 사람들의 코드를 보며 이해한대로 다시 코딩하였습니다.

틀린 코드

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
29
30
31
32
33
34
#include <string>
#include <vector>
#include<iostream>
using namespace std;

int solution(string name) {
    int answer = 0;
    size_t size = name.size();

    size_t index = 0;
    for (; index < size; ++index)
    {
        if (index == 1 && name[index] == 'A')
        {
            while (name[index] == 'A')
                ++index;
        }
        if (name[index] - 65 > 13)
        {
            cout << answer << name[index] << "1" << '\n';
            answer += 91 - name[index];
            cout << 91 - name[index] << "asdsad";
        }
        else
        {
            cout << answer << name[index] << "2" << '\n';
            answer += name[index] - 65;
            cout << name[index] - 65 << "qqqqqq";
        }
        ++answer;
    }
    //마지막에 인덱스를 옮긴것도 포함이 되므로
    return answer - 1;
}

4. 접근 방법을 적용한 코드

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <string>
#include <vector>
#include<iostream>
using namespace std;

int solution(string name) {
    int answer = 0;
    //현재 어디인지 가르키는 변수
    int move = 0;
    //A로 초기화
    string compare(name.length(), 'A');
    while (compare != name)
    {
        //next는 다음인덱스를 왼쪽부터 돌 지 오른쪽부터 돌 지 정하는 변수
        int next = 0; int left = 0; int right = 0;
        for (int i = 0; i < name.size(); ++i)
        {
            if (move + i < name.size()) right = move + i;
            else  right = move + i - name.size();

            if (move - i >= 0) left = move - i;
            else left = move - i + name.size();

            //오른쪽으로 가야하는 경우가 우선순위를 가집니다.
            if (compare[right] != name[right]) next = right;
            else if (compare[left] != name[left])next = left;
            else
                continue;


            answer += i;
            //조이스틱 위로 누른게 빠른지, 밑으로 누른게 빠른지
            answer += min(name[next] - 'A', 'Z' - name[next] + 1);
            //값을 바꿔줌.
            compare[next] = name[next];
            break;
        }
        move = next;
    }

    return answer;
}

5. 결과

테스트케이스 11때문에 너무 어려웠습니다.

This post is licensed under CC BY 4.0 by the author.