[Algorithm]Programmers:JoycastbyPython
8651 ワード
[問題のショートカット]https://programmers.co.kr/learn/courses/30/lessons/42860
JOYSTICでアルファベット名を完成最初はAのみで構成されていました
ex)完成する名前は3文字AAA、4文字AAAAAA
JOYロッドを各方向に移動し、以下のようにします.
▲-次の文字
▼-前の文字(AからZへ下へ)
◀-カーソルを左に移動します(最初の位置から最後の文字にカーソルを左に移動します).
▶-カーソルを右に移動
たとえば、次の方法でJAZを作成できます.の1番目の位置でJOYロッドを9回上向きに操作し、Jを完了します. レバーを1回左に移動し、最後の文字位置にカーソルを移動します. の最後の位置で、JOYSTICを1回下に操作してZを完了します.
したがって、11回移動して「JAZ」を作成することができます.これは最小の移動です.
パラメータとして名前を作成する場合は、名前に対するJOYSTIC操作回数の最大値を返すソリューション関数を作成します. 制限)
nameはアルファベットの大文字のみで構成されています.
nameの長さは1または20以下です.
I/O例)
問題説明だけ見ていると簡単に見えるが、条件がはっきりしないので問題が多い(?)問題です...実際、
まず私が間違った問題を理解した(推測すると...)右カーソルです.
最初の位置から左に移動すると、最後のアルファベットでカーソル移動が表記されているので、右側(▶)にも同様の機能があると思いますが、該当する内容がないのでパス!
次に、混乱を経験したのはカーソルの最初の位置です.
例では、最初の文字から開始するが、最初の文字から開始しなければならないという言い方はないので、最初は最少の文字位置を上下に操作して開始するが、他人の問題を参考にして無条件に最初の位置から開始する.
しかし、内容は私だけが混乱しているようです...
再び本題に入るために、「Joycastic」の問題を解くには、以下のように書きます.
check関数
左:左インデックス
右:右インデックス
cnt:移動距離
「A」は上下操作を必要としないので、「A」に遭遇したときに、操縦JOYを最小化するための話題が出てきました!
したがって,check関数はJoycastの左(◀)右(▶)方向を決定するための関数であり,「A」が出現した箇所から,左(右)方向から移動した場合に,最初に操作する文字(「A」ではない文字)が出現した場合に,戻り位置(idx)と移動次数(cnt)である.
答:操作回数の最小値
Step:マニピュレータレバーを上下に操作したときの最小移動回数をリストします.
もっと正確な問題条件を提出する必要があるようです...
📌問題の説明
JOYSTICでアルファベット名を完成最初はAのみで構成されていました
ex)完成する名前は3文字AAA、4文字AAAAAA
JOYロッドを各方向に移動し、以下のようにします.
▲-次の文字
▼-前の文字(AからZへ下へ)
◀-カーソルを左に移動します(最初の位置から最後の文字にカーソルを左に移動します).
▶-カーソルを右に移動
たとえば、次の方法でJAZを作成できます.
したがって、11回移動して「JAZ」を作成することができます.これは最小の移動です.
パラメータとして名前を作成する場合は、名前に対するJOYSTIC操作回数の最大値を返すソリューション関数を作成します.
nameはアルファベットの大文字のみで構成されています.
nameの長さは1または20以下です.
I/O例)
💡 問題を解く
問題説明だけ見ていると簡単に見えるが、条件がはっきりしないので問題が多い(?)問題です...実際、
질문하기
ページでも多くの人が混乱を経験していますが、ほほほまず私が間違った問題を理解した(推測すると...)右カーソルです.
最初の位置から左に移動すると、最後のアルファベットでカーソル移動が表記されているので、右側(▶)にも同様の機能があると思いますが、該当する内容がないのでパス!
次に、混乱を経験したのはカーソルの最初の位置です.
例では、最初の文字から開始するが、最初の文字から開始しなければならないという言い方はないので、最初は最少の文字位置を上下に操作して開始するが、他人の問題を参考にして無条件に最初の位置から開始する.
しかし、内容は私だけが混乱しているようです...
再び本題に入るために、「Joycastic」の問題を解くには、以下のように書きます.
check関数
左:左インデックス
右:右インデックス
cnt:移動距離
「A」は上下操作を必要としないので、「A」に遭遇したときに、操縦JOYを最小化するための話題が出てきました!
したがって,check関数はJoycastの左(◀)右(▶)方向を決定するための関数であり,「A」が出現した箇所から,左(右)方向から移動した場合に,最初に操作する文字(「A」ではない文字)が出現した場合に,戻り位置(idx)と移動次数(cnt)である.
答:操作回数の最小値
Step:マニピュレータレバーを上下に操作したときの最小移動回数をリストします.
def check(idx, step):
left = right = idx # 왼쪽방향 index | 오른쪽방향 index
cnt = 0
while True: #"A"가 아닌 문자가 나올 때 까지 반복한다.
right += 1
left -= 1
cnt += 1
if right == len(step): # 오른쪽 끝 위치에 도달하면 고정
right = len(step)-1
if left == -1: # 왼쪽 끝 위치에 도달하면 오른쪽으로 끝 이동
left = len(step)-1
if step[right]: # 오른쪽 방향에 문자가 나타나면 인덱스, 횟수 return
return right, cnt
if step[left]: # 왼쪽 방향에 문자가 나타나면 인덱스, 횟수 return
return left, cnt
def solution(name):
answer = 0
step = [0] * len(name)
# 위아래 조이스틱 조작 최소값은
# "A"부터 문자까지의 거리와 "Z"부터 문자까지의거리 + 1 중 최소값이다.
for i in range(len(name)):
step[i] = min(abs(ord("A")-ord(name[i])), abs(ord("Z")+1 - ord(name[i])))
idx = 0
while sum(step):
# "A"가 아닌 문자일 경우 위아래 조이스틱 조작
if step[idx]:
answer += step[idx]
step[idx] = 0
# "A"가 나타날 경우 왼쪽, 오른쪽 방향 결정(check 함수)
else:
idx, cnt = check(idx, step)
answer += cnt + step[idx]
step[idx] = 0
return answer
コードを修正して、最後の位置から右に移動させたときに最初の位置に着いて、同じように通過しました...もっと正確な問題条件を提出する必要があるようです...
Reference
この問題について([Algorithm]Programmers:JoycastbyPython), 我々は、より多くの情報をここで見つけました https://velog.io/@djagmlrhks3/Algorithm-Programmers-조이스틱-by-Pythonテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol