카테고리 없음
[Programmers]탐욕법 > 조이스틱(c++)
수기
2022. 1. 21. 23:33
https://programmers.co.kr/learn/courses/30/lessons/42860#
코딩테스트 연습 - 조이스틱
조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다. ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA 조이스틱을 각 방향으로 움직이면 아래와 같습니다. ▲ - 다
programmers.co.kr
아직 해결하지 못했다 ㅠㅠ 테스트케이스 23번만 계속 실패한다..
문제를 푼 사람들은 "ABABAAAAABA" 답이 11이라는데..
뒤에서부터 처리 후 다시 앞으로돌아가면 10이 나오는거 아닌가ㅠㅠ 모르겠다..
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int solution(string name) {
int answer = 0;
int right = 0;
int left = 0;
string name_back = name;
for(int i=0;i<name.size();) {
int cnt = 0;
if(name[i]!= 'A') {
cnt = name[i] - 'A';
}
if(cnt > 13) cnt = 26 - cnt;
answer+= cnt + min(left, right);
name[i] = 'A';
if(count(name.begin(), name.end(), 'A') == name.size()) break;
right = 1;
left = 1;
//오른쪽으로 가는 경우, 왼쪽으로 가는 경우
for(int j=i+1, k=i-1;j>=0;j++,k--){
j = j % name.size();
if(k<0) k = name.size() +k;
if(name[j] == 'A') right++;
if(name[k] == 'A') left++;
if(name[j] != 'A' ) {i = j; break;}
if(name[k] != 'A' ) {i = k; break;}
}
}
//뒤에서부터 출발하는 경우
right = 1;
left = 1;
int answer_back = 0;
for(int i=name_back.size()-1;i>=0;) {
int cnt = 0;
if(name_back[i]!= 'A') {
cnt = name_back[i] - 'A';
}
if(cnt > 13) cnt = 26 - cnt;
answer_back+= cnt + min(left, right);
name_back[i] = 'A';
if(count(name_back.begin(), name_back.end(), 'A') == name_back.size()) break;
right = 1;
left = 1;
//오른쪽으로 가는 경우, 왼쪽으로 가는 경우
for(int j=i+1, k=i-1;j>=0;j++,k--){
j = j % name_back.size();
if(k<0) k = name_back.size() +k;
if(name_back[j] == 'A') right++;
if(name_back[k] == 'A') left++;
if(name_back[k] != 'A' ) {i = k; break;}
if(name_back[j] != 'A' ) {i = j; break;}
}
}
answer = min(answer, answer_back);
return answer;
}
int main() {
string name = "ABABAAAAABA";
solution(name);
}