[PG]JOYSTIC


“JOY STIC”-Lv2


🎲問題の説明
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例
    namereturn"JEROEN"56"JAN"23
    📓計画問題の理解と解答
    」」」」」」」」」」」
    最後にチェックしたA...A移動は不要です.(全ての位置検査、移動回数xは不要)
    ▼0番目の位置から右または①に、左(後ろ)②に移動します.
    質問に答えるときは右か左の場合、真ん中A...Aというところがあれば行きの道から途中のAに戻って…Aを通らないところがある方法が…!文字で書こうとすると、解釈がはっきりしないようです(ㅠㅠ)
    プログラマーの質問を見るとnameの場合はAに移動する回数が最も少ない.
    "AABAAAAABBB"右折、元の道を戻り、逆方向に進む方法③
    0->1->2->1->0->10->9->8逆行して元の道に戻り、前向きに進む方法④

    ✍🏻私のコード2+正しいコード

    class Solution {
        public int solution(String name) {
            // 돌리는 횟수
    		int rotate = 0;
    		for(int i=0; i<name.length(); i++) {
    			if(name.charAt(i) != 'A') {
    				rotate += Math.min((((int) name.charAt(i)) - 65), (91 - (int) name.charAt(i)));
    			}
    		}
    		
    		// 정방향
    		int idx_f = 0;
    		for(int i=name.length()-1; i>=0; i--) {
    			if(name.charAt(i) != 'A') {
    				idx_f = i;
    				break;
    			}
    		}
    		
    		int min = Integer.MAX_VALUE;
    		int move = 0;
    		for(int i=0; i<idx_f; i++) {
    			move += 1;
    		}
    		min = Math.min(min, move);
    		
    		// 역방향
    		int idx_b = 0;
    		for(int i=1; i<name.length(); i++) {
    			if(name.charAt(i) != 'A') {
    				idx_b = i;
    				break;
    			}
    		}
    		move = 0;
    		for(int i=name.length()-1; i>=idx_b; i--) {
    			move += 1;
    		}
    		min = Math.min(min, move);
    		
    		// 다시 되돌아가는 경우 (중간에 존재하는 A를 모두 검사)
    		int start, end;
    		for(int i=0; i<name.length(); i++) {
    			if(name.charAt(i) == 'A') {
    				start = i;
    				for(int j=start+1; j<name.length(); j++) {
    					if(name.charAt(j) != 'A') {
    						end = j-1;
    						move = checkA(start, end, name.length()-1);
    						break;
    					}
    				}
    			}
    			min = Math.min(min, move);
    		}
    		
            return rotate+min;
        }
        
        	public static int checkA(int start, int end, int l) {
    		int move = 0;
    		if(start == 0) start = 1;
    		// 정방향 후 역방향
    		move = (start-1)*2 + (l-end);
    		
    		// 역방향 후 정방향
    		move = Math.min(move, (l-end)*2 + start-1);
    		return move;
    	}
    }

    💡ケースを共有する前に、漠然と考えているだけでは、思考の数が非常に多く、複雑だと感じますが、文字で一つ一つ状況の数を計算するのは、書くのは難しくありません.頭が複雑なときは、文字で丁寧に記録する習慣をつけましょう.