Java構文とアルゴリズム(string 2)


JAVA文法

  • All()の置換:文字列を必要な文字列に変更
    通常は正規表現とともに使用されます
    ex) str="*AFC$FG"
    str=str.replaceAll("^A-Z",")/A-Z,そうでない場合は空
    //出力AFCFG
  • Character.isDigit(c):return boolean(文字値が数値であるかどうかを確認)
  • Integer.parseInt(str):str->int
  • に変更
  • Integer.toString(int):int->str
  • に変更
  • 絶対値Math.abs(i-j)/距離を求めるための
  • トリム():前後のスペースを削除
    ex) str="1 2 3 4 "
    str=str.trimp();//"1 2 3 4"
  • relace()またはAll()の置換:中間スペースの削除
    String str1 = "By default ";
    String result1 = str1.replaceAll("", "");//Bydefault
  • Math.pow(2,指数上昇)/returnはdoubleでintを使用
  • Character.getNumericValue(char):Character->Int
  • に変更

    質問です。



    学識


    All()を
  • で置換する正規表現
  • 特殊文字
  • を削除
  • フェリンドロン
  • コード#コード#

    package inflearn.section1_string;
    
    // 유효한 팰린드롬- 앞에서 읽을때나 뒤에서 읽을떄나 같은 문자열
    // 입력 -> found7, time: study; Yduts; emit, 7Dnuof -> 알파벳만 비교
    
    import java.util.*;
    
    public class Main8 {
    
        public String solution(String str) {
            String answer="YES";
    
            // 1. 대문자로 변경
            str=str.toUpperCase();
    
            // 2. 특수문자 정규 표현식을 이용해서 제거
            str=str.replaceAll("[^A-Z]","");
    //        System.out.println("str:"+str);
    
            // 3. stringBuilder의 reverse를 이용해서 문자 확인
            StringBuilder sb=new StringBuilder(str).reverse();
    
            String reverse_sb=sb.toString();
    
            if (!str.equals(reverse_sb)) {
                answer="NO";
            }
    
    
            return answer;
    
        }
        public static void main(String[] args) {
            Main8 main =new Main8();
            Scanner scan=new Scanner(System.in);
            System.out.println(main.solution(scan.nextLine()));
        }
    }

    質問です。



    学識

  • 左から
  • 更新
  • の右側から更新を開始し、最適な値を探します.
  • 解決策

  • 時間複雑度:n^2
  • で検索する文字のインデックスをarraylistに保存
    ストレージ//eのすべての場所
  • 文字列のインデックスを1つずつ取り出し、arraylistに格納abs(絶対値)と比較し、短い
  • を検索する.
    見つかった値
  • を配列
  • に保存します.
  • アルゴリズム(講座)
  • 左ターゲットと右ターゲットの距離
  • を比較する.
    重要なのは
  • p値を1000に設定し、eが最も遠いと仮定することである.
  • 時間複雑度:n
  • pが最も遠いと考えられる値p=1000
    左から移動
    検索する値がtargetに等しい場合は、pを0に初期化します.
    異なる場合、pは1
  • 増加する.
  • 右側からナビゲート
    p=1000
    検索する値がtargetに等しい場合は、pを0に初期化します.
    異なる場合、pを増加する、既存の左ナビゲーションの値と比較する(最小値を選択する)
  • .

    コード#コード#

    package inflearn.section1_string;
    import java.util.*;
    
    public class Main10 {
    
    
        public void solution1(String str) {
    
            String []temp=str.split(" ");
            // temp[0] -> 문자열, temp[1] -> 문자
    
    //        int []dis=new int[temp[0].length()];
            String answer="";
    
            char []arr_temp=temp[0].toCharArray();
            char e=temp[1].charAt(0);
    
    
            // e의 위치 인덱스
            ArrayList<Integer>arr=new ArrayList<>();
            for (int i=0;i<arr_temp.length;i++) {
                if (arr_temp[i]==e) {
                    arr.add(i);
                }
            }
    
            for (int i=0;i<arr_temp.length;i++) {
    
                int tmp=Integer.MAX_VALUE;
                for (Integer j:arr) {
                    int k=Math.abs(i-j);
                    if (tmp>k) {
                        tmp=k;
                    }
                }
                // Int ->String
                answer+=Integer.toString(tmp)+" ";
            }
            answer=answer.trim();
            System.out.println(answer);
    
        }
    
        public void solution2(String str) {
    
            String []temp=str.split(" ");
            String answer="";
    
            char []arr_temp=temp[0].toCharArray();
            char e=temp[1].charAt(0);
    
            int [] ans=new int[arr_temp.length];
    
            // 왼쪽부터 탐색
            int p=1000; // 처음 가장 끝에 있는 target 거리라고 생각
            for (int i=0;i< arr_temp.length;i++) {
    
                if (arr_temp[i]==e) {
                    // p를 0으로 초기화하고 arr_te
                    p=0;
                }
    
                else {
                    // p를 증가
                   p++;
                }
                ans[i]=p;
            }
            // 출력
            System.out.println(Arrays.toString(ans)); //[1001, 0, 1, 2, 3, 0, 1, 2, 3, 4, 0]
    
            // 오른쪽부터 탐색
            p=1000;
            for (int i= arr_temp.length-1;i>=0;i--) {
                if (arr_temp[i]==e) {
                    p=0;
                }
                // 다르면 p를 증가시키고 기존값과 비교한다음에 그 중 작은 값을 ans에 넣는다.
                else {
                    p++;
                    int val=Math.min(p,arr_temp[i]);
                    ans[i]=val;
                }
            }
            System.out.println(Arrays.toString(ans));
    
        }
    
    
        public static void main(String[] args) {
            Main10 main =new Main10();
            Scanner scan=new Scanner(System.in);
    //        main.solution1(scan.nextLine());
    
    
            main.solution2(scan.nextLine());
    
    
        }
    }

    質問です。



    解決策

  • while forを使用して
  • を解決
  • でインデックス順にアクセス、
  • forからlte
  • を繰り返し移動

    コード#コード#

    package inflearn.section1_string;
    import java.util.*;
    public class Main11 {
    
        public String solution(String str) {
            String answer="";
            int lt=0;
            int rt=str.length();
    
            // 배열로 변환
            char []temp=str.toCharArray();
    
            while (lt<rt) {
                int tmp=1;
                char val=temp[lt];
                for (int i=lt+1;i<rt;i++) {
                    if (val==temp[i]) {
                        tmp++;
                    }
                    else {
                        break;
                    }
                }
    //            System.out.println("tmp:"+tmp);
                // Integer -> string
                String data=""+val;
                if (tmp!=1) {
                    data+=Integer.toString(tmp);
                }
                answer+=data;
                lt=lt+tmp;
            }
            return answer;
    
        }
        public static void main(String[] args) {
            Main11 main =new Main11();
            Scanner scan=new Scanner(System.in);
    
            System.out.println(main.solution(scan.next()));
        }
    }
    

    質問です。



    解決策

  • "#"、"*"を1 or 0
  • に変更
    各文字
  • 7個、ssに格納ex)10000011
  • ssをバイナリに変更し、「答え」(char)
  • として保存します.
  • (int)Math.pow(2,指数上昇)->2**3=8
  • コード#コード#

    // 암호 문제
    
    package inflearn.section1_string;
    import java.util.*;
    
    public class Main12 {
    
        public String solution(int num, String str) {
    
    //        1. '#', '*'를 1 or 0으로 변경
            char []temp=str.toCharArray();
            for (int i=0;i<temp.length;i++) {
                if (temp[i]=='#') {
                    temp[i]='1';
                }
                else {
                    temp[i]='0';
                }
            }
    
            // 출력
    //        System.out.println(Arrays.toString(temp));
            String answer="";
    //        2. 7개씩 문자 자르고 ss에 저장 ex) 1000011
            for (int i=0;i<num;i++) {
                String ss="";
    
                for (int j=0;j<7;j++) {
                    ss+=temp[7*i+j];
                }
    //            System.out.println("ss:"+ss);
    
    
                //3. ss를 2진법으로 변경하고 answer에 (char)로 저장
                // String -> 다시 배열로 변환
                char ans[]=ss.toCharArray();
                // String -> 2진수로 변환
                int value=0;
                int multi=6;
                for (int k=0;k<=6;k++) {
                    int b=(int)Math.pow(2,multi);
                    // char -> Int로 변환
                   int val=Character.getNumericValue(ans[k]);
                   // 출력
                    value+=b*val;
                    multi--;
                }
                
                answer+=(char)value;
            }
    
            return answer;
    
        }
    
    
        public static void main(String[] args) {
            Main12 main =new Main12();
            Scanner scan=new Scanner(System.in);
            int num=scan.nextInt();
            String str=scan.next();
    
            System.out.println(main.solution(num,str));
        }
    }

    REF


  • https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4-%EC%BD%94%ED%85%8C%EB%8C%80%EB%B9%84/dashboard

  • https://cote.inflearn.com/contest/10/problems