プログラマ
22449 ワード
木の棒
問題はプログラマで確認できます.
✔方法
2-1. 配向時の移動回数
2-2. 前へ進むと「A」に出会い、逆方向に歩く回数
3-1. アルファベット順の検索回数
3-2. アルファベット順の検索回数
✔コード
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int findIdx(vector<char>& arr, char a){
int ret = 0;
for (int i=0; i<arr.size(); i++){
if( arr[i] == a){
ret = i;
}
}
return ret;
}
int solution(string name) {
/*
케이스
1) A 뭉치가 여러개인 경우 ex) BBAABBBBAAAB
2) A 뭉치가 연결되어 있는 경우 ex) AAABBAAAAA , AAAAABBAAA
3) A 가 마지막에 있는 경우 ex) BBAAAABBAAA
*/
int answer = 0;
vector<char> arr = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
vector<char> revers_arr = {'A','Z','Y','X','W','V','U','T','S','R','Q','P','O','N','M','L','K','J','I','H','G','F','E','D','C','B'};
// 1 step : 문자열 중 A가 연속인 뭉치 중, 가장 긴 뭉치 찾기
int A_num=0, max_A_num=0;
int startIdx=-1, max_startIdx=-1;
int endIdx=-1, max_endIdx=-1;
for (int idx=0; idx<name.length(); idx++){
if( name[idx] == 'A' ){
A_num++;
if( startIdx == -1 && endIdx == -1){
startIdx = idx;
}
else if( startIdx != -1 && endIdx != -1){
startIdx = idx;
}
}
if( name[idx+1] != 'A' ){
if( startIdx != -1 && endIdx == -1){
endIdx = idx;
if( max_A_num < A_num ){
max_A_num = A_num;
max_startIdx = startIdx;
max_endIdx = endIdx;
}
A_num = 0;
startIdx = -1;
endIdx = -1;
}
}
}
// 2 step : 시작점에서 A까지 정방향으로 가는 거리와 정방향으로 가다 역방향으로 가는 거리 중 가까운 거리 찾기
int distance = name.length();
int tail_A_size = 0;
if( name[name.length()-1] == 'A'){
for( int i=name.length()-1; i>=0; i--){
if( name[i] == 'A' ){
tail_A_size++;
}
else{
break;
}
}
}
if( max_A_num != 0){
answer = min(name.length()-1-tail_A_size , ((max_startIdx-1) * 2) + (name.length()-1)-(max_endIdx) );
}
else {
answer = name.length()-1;
}
// 4 step : 위/아래 횟수 계산
for (int i=0; i<name.length(); i++){
if( name[i] != 'A'){
answer += min(findIdx(arr, name[i]), findIdx(revers_arr, name[i]));
}
}
return answer;
}
int main(void){
string name = "CANAAAAANAN";
int ret;
ret = solution(name);
cout << ret << endl ;
return 0;
}
チップ
問題を解決するのに長い時間がかかった.
問題の条件のうち,1位は
왼쪽으로 이동시 마지막 자리로 이동할 수 있다
の条件であった.この条件を見ると、もちろん最後の位置では
오른쪽으로 이동해도 첫번째 자리로 올 수 있다
だと思います.しかし、これらの条件は問題ありません.
問題で明確に指摘されているかもしれない.
이름에 대해 조이스틱 조작 횟수의 최솟값을 return 하도록 solution 함수를 만드세요.
という文章では、최솟값
の部分には多くの誤解があるかもしれません.👍 コメントサイト
Reference
この問題について(プログラマ), 我々は、より多くの情報をここで見つけました https://velog.io/@aszxvcb/프로그래머스-lv2-조이스틱テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol