이 문제의 경우 문제를 잘못 이해해서 너무 오랜 시간이 걸렸다...
문제를 꼼꼼히 보고 파악하고 생각하는 시간이 중요하다고 생각을 했고, 무엇보다 이유없이 주어진건 없다는 것을 꼭 기억해야겠다.
일단 이문제의 경우 두가지를 구하여 값을 구해야 한다.
1) 조이스틱을 위아래로 몇번을 움직여야 현재 입력하려는 값을 입력 할 수 있는가?
2) 조이스틱을 좌우로 몇번을 움직여야 현재 입력하는 부분으로 커서를 옮길 수 있는가?
이렇게 하는 방법에는 여러가지가 있을 수 있다. 그 중에서 가장 적게 움직이는 경우를 선택해야 하는 것이다.
이를 위해서 먼저 대문자 알파벳의 경우 A를 기준으로 N까지 즉 13번을 움직이는 것이 반대편 방향키로 누르는 것보다 더 효율적인 것을 알 수 있다. 그래서 위쪽 방향키로만 이동하여 나오는 결과와 아래쪽 방향키로만 이동하여 나오는 결과를 비교하여 그 값이 더작은 값을 answer에 더한다.
그리고 다음 구해야 하는 것이 커서를 몇번 움직이어야 하는가이다.
이 경우에는 먼저 반복문을 name의 길이 만큼을 돌면서 처음을 기준으로 왼쪽으로 이동한 횟수 + 오른쪽으로 이동한 횟수를 더해준다. 여기서 왼쪽으로 이동한 횟수는 오른쪽으로 이동을 다하고 그리고 이동을 다했는데, 뒤에 A가 있다 이경우에 대해서 index값을 기억을 합니다. 그런데 또 A가 있다 그러면 인덱스 값을 +1하여 기억을 합니다. 이런식으로 하여 이 값을 구했으면 name의 길이에서 이 기억한 인덱스 값을 빼주면 왼쪽으로 간 횟수가 나옵니다. 이 두값을 더해주고, 그리고 마지막으로 왼쪽으로 갔던 오른쪽으로 갔던 순서가 있을 것입니다. 그래서 먼저 갔다면 그만큼을 다시 되돌아와야 하기 때문에 앞에서 왼쪽으로 갔던 횟수와 오른쪽으로 갔던 횟수를 비교하여 더 적게 이동한 횟수를 먼저 해주어야 하므로, 작은 값을 결과에 더해줍니다.
#include <string>
#include <vector>
#include <cmath>
#include <algorithm>
#include <unordered_map>
#include <iostream>
using namespace std;
int cur_char = 'A';
int solution(string name) {
int answer = 0;
unordered_map<char,int> map;
for(int i=0;i<name.size();i++)
{
map.insert(make_pair(name[i],i));
}
for(int i=0;i<name.size();i++)
{
answer += min(abs(cur_char - name[i]),26-abs(cur_char-name[i])) % 14;
}
int left_right = name.size()-1;
int len = name.size();
for(int i=0;i<name.size();i++)
{
int next_i = i+1;
while(next_i < name.size() && name[next_i]=='A')
{
next_i++;
}
left_right = min(left_right, i + len - next_i + min(i, len - next_i));
}
answer += left_right;
return answer;
}
/*
조이스틱으로 알파벳 이름을 완성하라
맨처음엔 A로만 이루어져있다.
제일먼저 A에 가까운 알파벳을 입력을한다.
현재 입력한 값을 저장을 한다.
이 저장한 값에서 얼마나 가까운 알파벳 + 이동횟수를 구한다. pair로 저장을 하면 될듯? (알파벳, 이동횟수)
그리고 min을 통하여 가장 작은 값을 찾는다.
name을 char형 배열에 쪼개어 넣어야한다. 현재 값을 변수로 가지고 있어야 한다.
현재 인덱스를 하나씩 비교를 하면서 위치가 더 큰지 작은지를 확인한다.
*/
나는 A와 Z의 연산을 통하여 해당 알파벳으로 변환하기 위하여 몇번을 이동해야하는지를 계산을 하였는데, 이 방법 말고 그냥 해시테이블을 선언하여 A~Z에 대하여 A를 기준으로 몇번을 움직여야 하는지를 해시테이블의 값으로 추가를 하면 더욱 좋은 것 같다.
아규먼트에 함수를 넣어서는 안된다. 이문제에서 size() 메소드를 아규먼트로 사용하니까 계속 오류가 발생을 하였다.
이 문제가 왜 일어날지 생각을 해봤는데, 아마도 size()메소드의 return값이 아닌 size()메소드 그대로가 아규먼트로 들어간 것같다. 이렇게 되면 함수포인터로 이 size()메소드를 함수가 이해를 하고, 함수에 정의된 인수와의 타입과는 차이가 발생을하여 오류가 발생을 하는 것으로 보인다.