String(문자열) 섹션 - (3)

728x90

String(문자열) 섹션 - (3)

1-9. 숫자만 추출 | 아스키 번호로 구분 후 (1) answer 누적 or (2) isDigit() 구분 후 형변환

*  1-9.숫자만 추출
 *  
 *  문자와 숫자가 섞여있는 문자열이 주어지면 그 중 숫자만 추출하여 그 순서대로 자연수를 만듭니다.
 *  만약 “tge0a1h205er”에서 숫자만 추출하면 0, 1, 2, 0, 5이고 이것을 자연수를 만들면 1205이 됩니다.
    추출하여 만들어지는 자연수는 100,000,000을 넘지 않습니다.
        ( 즉, 첫 0 은 무시함) 
        //  1)문자, 숫자 식별  -> 아스키 번호로 구분 
         *              문자형 숫자 는'0': 48 <= x <= '9' : 57 가진다.
            2) 숫자만 이어붙이고 
                방식 1)
                answer = answer * 10 + (x - 48) 로 이어붙임
                방식 2) 
            String 상태에서 isDigit()으로 구분한 뒤 이어붙인 문자열 parseInt로 형변환시킴       
            3) 리턴
 * */
public class Main1 {
    //솔루션 함수 -(1) 
    public int solution(String str) {
          int answer = 0;
          for(char x : str.toCharArray()) {
        if(x >= 48 && x <= 57) answer = answer * 10 + (x- 48);//실제 숫자로 교환됨
          }
          return answer;
    }
    //솔루션 함수 -(2)
    public int solution2(String str) {
        String answer = "";
        for(char x: str.toCharArray()) { //단순 문자로 취급하므로 첫 시작 0 은 제거해줘야 함
            if(Character.isDigit(x)) {
                answer += x;
            }
        }
        return Integer.parseInt(answer) ; // 0208 -> 숫자 208이 된다.
    }
    //실행 메인 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Main1 T = new Main1();
        Scanner kb = new Scanner(System.in);
        //1) 입력 문자열 
        String str = kb.next();
        //2) 출력 (1) 
        System.out.println(T.solution(str));
        //3) 출력 (2) 
        System.out.println(T.solution2(str));
    }
}

1-10. 가장 짧은 문자거리(최소거리)

/*
 * 1-10. 가장 짧은 문자거리
 * 한 개의 문자열 s와 문자 t가 주어지면,
 * 문자열 s의 각 문자가 문자 t와 떨어진 최소거리를 출력하는 프로그램을 작성하세요.
 * 예를 들어, 
 *  s: teachermode    t : e
 *  [양쪽 모두에 e 가 존재하는데 이 경우 최소거리 구하는 법]
 *  1) 왼쪽 e 기준의 거리
 *  2) 오른쪽 e 기준의 거리
 *  3) 둘 중 작은 값 = 최소거리 로 세팅한 최종 answer 배열 반환하면 됨
 * */
public class Main2 {
    //솔루션 함수
    public int[] solution(String s, char t) {
        int[] answer = new int[s.length()];
        int p = 1000;  // 측정용 변수

        //1) 왼쪽 e 기준 거리 
        for(int i = 0; i<s.length(); i++) {
            if(s.charAt(i) == t) { //타겟 문자인 경우 0 세팅
                p = 0;
                answer[i] = p;
            }else { //본인 아닌 경우 
                p++; //측정 p 증가시키면서 
                answer[i] = p; //정답지에 세팅
            }
        }
        //2) 오른쪽 e 기준 거리 | 거꾸로 돌려서 측정
        p = 1000;
        for(int i = s.length()-1; i>=0; i--) {
            if(s.charAt(i) == t) {
                p = 0;
            }else {
                   p++;
            // *** answer[]는 min()으로 비교 (기존값 vs 현 P) 중 더 작은값으로 세팅 ****
                   answer[i] = Math.min(answer[i], p);
            }
        }
        return answer;
    }
    //실행 메인 
    public static void main(String[] args) {
        // TODO Aut o-generated method stub
        Main2 T = new Main2();
        Scanner kb = new Scanner(System.in);

        // 1) 입력 
        String s = kb.next();
        char t = kb.next().charAt(0);

        // 2) 출력
        for(int x: T.solution(s, t)) {
            System.out.print(x+" ");
        }
    }
}

1-11. 문자열 압축

/*
 *  1-11. 문자열 압축
 *  알파벳 대문자로 이루어진 문자열을 입력받아 같은 문자가 연속으로 반복되는 경우 반복되는
    문자 바로 오른쪽에 반복 횟수를 표기하는 방법으로 문자열을 압축하는 프로그램을 작성하시오.
    단 반복횟수가 1인 경우 생략합니다. 

    cnt = 반복횟수 카운팅 변수
         배열로 받아서 각 문자 i, i+1 지칭하는 애가 1) 같은 문자인 경우, cnt++ 
                    2) 다른 문자인 경우, 반복 끝났으니 반환 
                                              answer에 [현 i 지칭 문자 + cnt(반복횟수)] 이어 붙이기
                      다시 cnt = 1 재세팅
 * */
public class Main3 {
    public String solution(String s) {
        String answer = "";
        s += " "; //뒤에 빈 문자 하나 덧붙여줄 것 (왜냐면 다를 때만 현 문자 출력하니까)
        int cnt = 1; //최소 1번은 반복되니

        for(int i = 0; i<s.length()-1; i++) {
            if(s.charAt(i) == s.charAt(i+1)) cnt++;
            else {
                answer += s.charAt(i);
                if(cnt > 1) { //반복 횟수 1은 생략하므로
                    answer += String.valueOf(cnt);
                    cnt = 1;//다시 초기화
                }
            }
        }
        return answer;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Main3 T = new Main3();

        Scanner kb = new Scanner(System.in);
        String str = kb.next();

        System.out.println(T.solution(str));
    }
}

1-12. 암호 해독 문제

/* 1-12. 암호 
 * 비밀 편지 해독 문제 
[입력]
첫 줄에는 보낸 문자의 개수(10을 넘지 안습니다)가 입력된다. 
다음 줄에는 문자의 개수의 일곱 배 만큼의 #또는 * 신호가 입력됩니다.
현수는 항상 대문자로 해석할 수 있는 신호를 보낸다고 가정합니다.

[출력]
영희가 해석한 문자열을 출력합니다.

 // 암호는 7개 단위로 하나의 대문자 대체 O 
  1) 암호 -> 2진수 (#=1, *=0) 로 바꾸고
  2) 2진수 -> 10진수 변환 
  3) 아스키 번호 기준으로 10진수 -> 65 문자로 변환시킴 (최종 해석문) 

  //받은 문자열을 
   * -> 7개 단위로 잘라서 subString() 끊어 읽고.  -> 2진수 replace() 하고 
   * -> 10진수로 변형하고 -> 아스키에 맞게 문자 변형  
  */
public class Main4 {
    //솔루션 함수 
    public String solution(int n, String s) {
        String answer = "";
        for(int i = 0; i<n; i++) {
            //(1) 7개 단위로 뽑고 # = 1, * = 0 변형시킴
            String tmp = s.substring(0, 7).replace('#', '1').replace('*', '0');

            //(2) tmp(String형태) 2진수 를 10진수 num으로 변형 
            int num = Integer.parseInt(tmp, 2); 

            //(3) num을 char 강제 형변환 시킨 뒤 answer에 이어붙임
            answer += (char) num;

            // 뽑고 난 뒷 내용물은 보존시킴
            s = s.substring(7);     
        }
        return answer;
    }
         //실행 메인
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Main4 T = new Main4();
        Scanner kb= new Scanner(System.in);
        //1) 입력
        int n = kb.nextInt();
        String s = kb.next();

        //2) 출력
        System.out.println(T.solution(n, s));

    }
}
728x90