「リアリティ」の実装:アイデアをコードに変換


実施とは?


頭の中のアルゴリズムをソースコードに変換するプロセス.通常、トラブルシューティングの分野では、実装タイプの問題は「プールのことを考えやすいが、ソースコードに移行するのは難しい」ことを意味します.
典型的なタイプはアルゴリズムが簡単であるが,コードが長すぎる問題,特定の小数位数に出力する必要がある問題,文字列が入力時にパケット化する必要がある問題,これらはいずれも比較的厄介な実装タイプの問題である.
[フルナビゲーション]
:すべての状況で迷わず総数を計算した解決方法
[シミュレーション]
:問題で提案されたアルゴリズムを段階的に実行する必要がある問題タイプ

#例1(上下左右)-シミュレーション


💡 問題の状況
旅行家AはNxNサイズの正方形空間に立っている.この空間は1×1の大きさの正方形に分かれている.最左上隅座標は(1,1),最右下隅座標は(N,N)である.旅行家Aは上、下、左、右方向に移動することができ、開始座標は常に(1,1).私たちの前に旅行家Aが移動を計画する計画書が置いてあります.計画書には1行のスペースを基準に、L、R、D、Uの1文字が繰り返し書かれています.このとき,旅行者AがNxNサイズの正方形空間から離れる動作は無視される.計画書を作成する場合は、旅行者Aが最終的に到着した場所の座標を出力するプログラムを作成してください.
  • L:左シフト
  • R:右に1マス
  • 移動
  • U:上へ移動する
  • D:1つ下に移動
  • 💡 に答える
    入力した計画書順に座標を移動しますが、スペースからの移動であれば移動せずにスキップしたコードを書くだけです.
    import java.util.Scanner;
    
    /**
    * UpDownLeftRight
    */
    public class UpDownLeftRight {
    
       public static void main(String[] args) {
           // 초기 좌표
           int x = 1, y = 1;
    
           // 정사각형 크기 입력 받기
           Scanner sc = new Scanner(System.in);
           int n = sc.nextInt();
           sc.nextLine(); // \n 처리 - 정수 입력 받으면서 한꺼번에 처리하는 방법 없나...?
    
           // 계획서 입력받기
           String st = sc.nextLine();
           String[] plans = st.split(" ");
    
           for(String plan : plans) {
               int nx = x, ny = y;
    
               // 계획에 따라 이동해 준다
               switch (plan) {
                   case "U":
                       nx -= 1;
                       break;
                   case "D":
                       nx += 1;
                       break;
                   case "L":
                       ny -= 1;
                       break;
                   case "R":
                       ny += 1;
                       break;
                   default:
                       break;
               }
    
               // 공간 밖을 벗어날 경우 스킵
               if(nx < 1 || ny < 1 || nx > n || ny > n){
                   continue;
               }
               else { // 아닐 경우 반영
                   x = nx;
                   y = ny;
               }
           }
           
           System.out.println(x + " " + y);
           sc.close();
       }
    }
    💡 サンプル回答
    import java.util.*;
    
    public class Main {
    
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
    
            // N을 입력받기
            int n = sc.nextInt();
            sc.nextLine(); // 버퍼 비우기
            String[] plans = sc.nextLine().split(" ");
            int x = 1, y = 1;
    
            // L, R, U, D에 따른 이동 방향 
            int[] dx = {0, 0, -1, 1};
            int[] dy = {-1, 1, 0, 0};
            char[] moveTypes = {'L', 'R', 'U', 'D'};
    
            // 이동 계획을 하나씩 확인
            for (int i = 0; i < plans.length; i++) {
                char plan = plans[i].charAt(0);
                // 이동 후 좌표 구하기 
                int nx = -1, ny = -1;
                for (int j = 0; j < 4; j++) {
                    if (plan == moveTypes[j]) {
                        nx = x + dx[j];
                        ny = y + dy[j];
                    }
                }
                // 공간을 벗어나는 경우 무시 
                if (nx < 1 || ny < 1 || nx > n || ny > n) continue;
                // 이동 수행 
                x = nx;
                y = ny;
            }
    
            System.out.println(x + " " + y);
        }
    
    }
    時間複雑度:O(N)(Nは移動回数を表す)

    #代表例2(視野角)-完全ナビゲーション


    💡 問題の状況
    整数Nを入力する場合は、0時00分00秒からN時59分59秒までのすべての時刻のうち、1つの時刻だけが3を含む場合でも、プログラムを作成します.
    💡 に答える
    00分00秒~59分59秒の全時刻において、1つの3だけでも含む全ケースの数(60 x 60)-(45 x 45)=1575種.したがって、時間nに3が含まれていない場合は2025を追加し、含まれている場合は3600を追加するコードを記述することができる.
    import java.util.Scanner;
    
    public class Time {
       public static void main(String[] args) {
           // 정수 n 입력 받기
           Scanner sc = new Scanner(System.in);
           int n = sc.nextInt();
           
           int result = 0;
    
           for(int i=0; i<=n; i++) {
               if (i == 3 || i == 13 || i == 23) {
                   result += 3600;
               }
               else {
                   result += 1575;
               }
           }
    
           System.out.println(result);
           sc.close();
       }
    }
    
    💡 サンプル回答
    import java.util.*;
    
    public class Main {
    
        // 특정한 시각 안에 '3'이 포함되어 있는지의 여부
        public static boolean check(int h, int m, int s) {
            if (h % 10 == 3 || m / 10 == 3 || m % 10 == 3 || s / 10 == 3 || s % 10 == 3)
                return true;
            return false;
        }
    
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
    
            // H를 입력받기 
            int h = sc.nextInt();
            int cnt = 0;
    
            for (int i = 0; i <= h; i++) {
                for (int j = 0; j < 60; j++) {
                    for (int k = 0; k < 60; k++) {
                        // 매 시각 안에 '3'이 포함되어 있다면 카운트 증가
                        if (check(i, j, k)) cnt++;
                    }
                }
            }
    
            System.out.println(cnt);
        }
    
    }
    1日は24 x 60 x 60=86400秒で構成されているので,3が含まれているか否かを1つ1つ徹底的に探索することができる.