자바 문법 및 알고리즘 (string 2)

zio도미닉·2021년 10월 6일
0

JAVA 문법

  • replaceAll( ) : 문자열을 원하는 문자열로 변경
    보통 정규식 표현과 같이 사용
    ex) str="*AFC$FG"
    str=str.replaceAll("[^A-Z]","") // A-Z가 아니라면 공백처리
    // 출력 AFCFG
  • Character.isDigit(c) : return boolean (Chracter값이 숫자인지 확인)
  • Integer.parseInt(str) : str -> int로 변경
  • Integer.toString(int) : int -> str로 변경
  • 절대값 Math.abs(i-j) // 거리구할때 사용
  • trim() : 앞뒤 공백 제거
    ex) str=" 1 2 3 4 "
    str=str.trimp(); //"1 2 3 4"
  • relace() or replaceAll() : 가운데 공백 제거
    String str1 = " By default ";
    String result1 = str1.replaceAll(" ", ""); //Bydefault
  • Math.pow(2, 지수승) // return은 double, int로 캐스팅해서 사용
  • Character.getNumericValue(char) : Character -> Int로 변경

문제 1

배운점

  • replaceAll( )를 이용한 정규표현식
  • 특수문자 제거
  • 펠린드롬

코드

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()));
    }
}

문제 2

배운점

  • 왼쪽부터 갱신
  • 오른쪽부터 갱신하여 가장 최선의 값을 찾는다.

해결 방법

  1. 시간 복잡도 : n^2
    • 찾을려고 하는 문자의 인덱스를 arraylist에 저장
      // e의 위치를 다 저장
    • 문자열의 인덱스를 하나씩 꺼내면서 arraylist에 저장되어 있는 것과 abs(절대값)비교 후 짧은 것 찾음
    • 찾은 값을 배열에 저장
  1. 알고리즘 (강의)
  • 왼쪽의 타겟과 비교 후 오른쪽의 타겟과의 거리를 비교
  • 이때 p값을 1000으로 설정하여 가장 e가 멀리 있다고 가정하는게 중요
  • 시간 복잡도 : n
    1. p를 가장 먼 값 이라고 생각 p=1000
      왼쪽부터 탐색
      찾을려고 하는 값이 target과 같으면 p를 0으로 초기화
      다르면 p를 1증가
    2. 오른쪽부터 탐색
      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());


    }
}

문제 3

해결방법

  • while안에 for를 이용하여 해결
  • while은 인덱스 순서대로 접근, for는 몇개 반복되었는지 찾기
  • for에서 반복된 만큼 lt를 이동

코드

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()));
    }
}

문제 4

해결방법

  1. '#', '*'를 1 or 0으로 변경
  2. 7개씩 문자 자르고 ss에 저장 ex) 1000011
  3. ss를 2진법으로 변경하고 answer에 (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

profile
BackEnd Developer

0개의 댓글