[Programmers](高得点KIT)Greedy-Joycastic
https://programmers.co.kr/learn/courses/30/lessons/42860#
問題の説明
の1番目の位置でJOYロッドを9回上向きに操作し、Jを完了します. レバーを1回左に移動し、最後の文字位置にカーソルを移動します. の最後の位置で、JOYSTICを1回下に操作してZを完了します.
したがって、11回移動して「JAZ」を作成することができます.これは最小の移動です.
パラメータとして名前を作成する場合は、名前に対するJOYSTIC操作回数の最大値を返すソリューション関数を作成します. せいげんじょうけん
問題の説明
JOYSTICでアルファベット名を完成最初はAのみで構成されていました
ex)完成する名前は3文字AAA、4文字AAAAAA
JOYロッドを各方向に移動し、以下のようにします.
▲-次の文字
▼-前の文字(AからZへ下へ)
◀-カーソルを左に移動します(最初の位置から最後の文字にカーソルを左に移動します).
▶-カーソルを右に移動(最後の位置から右に移動し、最初の文字上にカーソルを置く)
たとえば、次の方法でJAZを作成できます.
したがって、11回移動して「JAZ」を作成することができます.これは最小の移動です.
パラメータとして名前を作成する場合は、名前に対するJOYSTIC操作回数の最大値を返すソリューション関数を作成します.
せいげんじょうけん
nameはアルファベットの大文字のみで構成されています.
nameの長さは1または20以下です.
I/O例
namereturn"JEROEN"56"JAN"23
Solution #include <string>
#include <vector>
using namespace std;
int solution(string name) {
int answer = 0;
for(auto i : name) answer += min(i - 'A', 'Z' + 1 - i);
int len = name.length();
int move = len - 1;
for(int i = 0; i < len; i++){
int next = i + 1;
while(next < len && name[next] == 'A') next++;
move = min(move, i + (len - next) + min(i, len-next));
}
answer += move;
return answer;
}
for(auto i : name) answer += min(i - 'A', 'Z' + 1 - i);
すべてのビット数について,最小の移動回数を求めてから加算する.どうせどこに行ってもJOYSTIC移動int move = len - 1;
for(int i = 0; i < len; i++){
int next = i + 1;
while(next < len && name[next] == 'A') next++;
move = min(move, i + (len - next) + min(i, len-next));
}
answer += move;
return answer;
各インデックスを確認します.どの方向に移動するかを決めるプロセスです.
原点からiに戻り、原点に戻り、len-nextの移動速度が速いか、原点からlen-nextに戻り、iに戻る移動速度が速いかを決定します.各位置確認後、最小値を移動すればよい.
例えば、ABABAABA
があると仮定する.いずれにしても、いったんJOY STICを移動し始めると、元の文字に戻ることはありません.つまり、うまくいったとしても、迷うことはありません.
iが1、nextが3の場合、iに戻ってそんなに遠く、それからlen-nextに戻るのはそんなに速いですか?原点からlen-nextまで、それからiに戻るのはそんなに速いですか?それともずっと歩いていくのがもっと速いですか?この三つの問題を考える.は、記事に存在するすべてのインデックスです.二つの文字を基準にしていますが、真ん中に挟まれた他の文字はどうせ通り過ぎるので、処理するかどうかにかかわらず、そうではないでしょうか.
最初は上手に描かれている場合、どれが一番Aに近い文字ではないかを確認してから、1つずつ加算する方法を選びました.その方法はもちろん正しいかもしれませんが、どこが問題なのか、いつもいくつかのテストボックスを間違えているので、方法を変えました.
Reference
この問題について([Programmers](高得点KIT)Greedy-Joycastic), 我々は、より多くの情報をここで見つけました
https://velog.io/@sierra9707/Programmers-고득점KIT-Greedy-조이스틱
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
namereturn"JEROEN"56"JAN"23
Solution #include <string>
#include <vector>
using namespace std;
int solution(string name) {
int answer = 0;
for(auto i : name) answer += min(i - 'A', 'Z' + 1 - i);
int len = name.length();
int move = len - 1;
for(int i = 0; i < len; i++){
int next = i + 1;
while(next < len && name[next] == 'A') next++;
move = min(move, i + (len - next) + min(i, len-next));
}
answer += move;
return answer;
}
for(auto i : name) answer += min(i - 'A', 'Z' + 1 - i);
すべてのビット数について,最小の移動回数を求めてから加算する.どうせどこに行ってもJOYSTIC移動int move = len - 1;
for(int i = 0; i < len; i++){
int next = i + 1;
while(next < len && name[next] == 'A') next++;
move = min(move, i + (len - next) + min(i, len-next));
}
answer += move;
return answer;
各インデックスを確認します.どの方向に移動するかを決めるプロセスです.
原点からiに戻り、原点に戻り、len-nextの移動速度が速いか、原点からlen-nextに戻り、iに戻る移動速度が速いかを決定します.各位置確認後、最小値を移動すればよい.
例えば、ABABAABA
があると仮定する.いずれにしても、いったんJOY STICを移動し始めると、元の文字に戻ることはありません.つまり、うまくいったとしても、迷うことはありません.
iが1、nextが3の場合、iに戻ってそんなに遠く、それからlen-nextに戻るのはそんなに速いですか?原点からlen-nextまで、それからiに戻るのはそんなに速いですか?それともずっと歩いていくのがもっと速いですか?この三つの問題を考える.は、記事に存在するすべてのインデックスです.二つの文字を基準にしていますが、真ん中に挟まれた他の文字はどうせ通り過ぎるので、処理するかどうかにかかわらず、そうではないでしょうか.
最初は上手に描かれている場合、どれが一番Aに近い文字ではないかを確認してから、1つずつ加算する方法を選びました.その方法はもちろん正しいかもしれませんが、どこが問題なのか、いつもいくつかのテストボックスを間違えているので、方法を変えました.
Reference
この問題について([Programmers](高得点KIT)Greedy-Joycastic), 我々は、より多くの情報をここで見つけました
https://velog.io/@sierra9707/Programmers-고득점KIT-Greedy-조이스틱
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
#include <string>
#include <vector>
using namespace std;
int solution(string name) {
int answer = 0;
for(auto i : name) answer += min(i - 'A', 'Z' + 1 - i);
int len = name.length();
int move = len - 1;
for(int i = 0; i < len; i++){
int next = i + 1;
while(next < len && name[next] == 'A') next++;
move = min(move, i + (len - next) + min(i, len-next));
}
answer += move;
return answer;
}
for(auto i : name) answer += min(i - 'A', 'Z' + 1 - i);
int move = len - 1;
for(int i = 0; i < len; i++){
int next = i + 1;
while(next < len && name[next] == 'A') next++;
move = min(move, i + (len - next) + min(i, len-next));
}
answer += move;
return answer;
Reference
この問題について([Programmers](高得点KIT)Greedy-Joycastic), 我々は、より多くの情報をここで見つけました https://velog.io/@sierra9707/Programmers-고득점KIT-Greedy-조이스틱テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol