[Algorithm]Programmers:JoycastbyPython


[問題のショートカット]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:マニピュレータレバーを上下に操作したときの最小移動回数をリストします.
    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
    コードを修正して、最後の位置から右に移動させたときに最初の位置に着いて、同じように通過しました...
    もっと正確な問題条件を提出する必要があるようです...