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

728x90

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

1-5. 특정 문자 뒤집기 | Character.isAlphabetic() 사용해보기

import java.util.Scanner;

/*  1-5. 특정 문자 뒤집기 
 *     영어 알파벳과 특수문자로 구성된 문자열이 주어지면 영어 알파벳만 뒤집고,

    특수문자는 자기 자리에 그대로 있는 문자열을 만들어 출력하는 프로그램을 작성하세요.
 * */

// 알파벳과 특수문자를 구분할 수 있어야 하고
// lt와 rt 가 양끝단에서 ++ 출발하고, 둘다 알파벳일 경우에만 교환이 이루어져야 함
// lt<rt 가 엇갈리면 끝나도록 하면 됨 

public class Main1 {
    //솔루션 함수
    public String solution(String str) {
        String answer = "";
        //일단 입력받은 문자열을 분해 => 각 문자 배열 만들어
        char[] s = str.toCharArray();
        int lt = 0, rt = str.length()-1; //각 포인팅 할 것 

        //주요 로직
         // -> 이 안에서 알파벳 아닌 동안은 계속 ++ --
        while(lt<rt) {
            if(!Character.isAlphabetic(s[lt])) lt++;
            else if(!Character.isAlphabetic(s[rt])) rt--;
            else { //이때 즉, 둘다 알파벳인 경우 swap
                char tmp = s[lt];
                s[lt]= s[rt];
                s[rt] = tmp;
                lt++;
                rt--;
            }
        }
        //반환할 String 에 재세팅
        answer = String.valueOf(s); //char[]을 String화 시켜줌
        return answer;
    }
    //실행 메인 
    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) 출력 : 알파벳만 뒤집힌 문자열 반환하여 출력함
        System.out.println(T.solution(str));
    }
}

1-6. 중복 문자 제거 | indexOf() 는 처음 발견한 문자의 위치만 반환한다.

import java.util.Scanner;

/* 1-6. 중복 문자 제거 
 * 소문자로 된 한개의 문자열이 입력되면 중복된 문자를 제거하고 출력하는 프로그램을 작성하세요.
    중복이 제거된 문자열의 각 문자는 원래 문자열의 순서를 유지합니다.

     중복 여부 검사 어떻게 할거냐 ?
             // 현재의 위치값 i == 해당 문자 첫 발견한 위치 indexOf(문자) 같으면 중복 X
            // 현재 위치와 첫 발견위치가 다르면 ==> 무시하고 같을 때만 쌓아서 반환하면 된다.
            //indexOf()는 처음으로 발견된 문자의 위치를 보여줌
 * */

public class Main2 {
    //솔루션 함수
    public String solution(String str) {
        String answer = "";
        for(int i = 0; i<str.length(); i++) {
            if(str.indexOf(str.charAt(i)) == i) answer += str.charAt(i); //이때만 누적시키면 됨
        }
        return answer;
    }

    //실행 메인 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Main2 T = new Main2();
        Scanner kb = new Scanner(System.in);
        // 1) 입력
        String str = kb.next();
        // 2) 출력 
        System.out.println(T.solution(str));
    }
}

1-7. 회문 문자열 | (1) index위치로 비교 (2) reverse한 것과 비교

/* 1-7. 회문 문자열 
 * 앞에서 읽을 때나 뒤에서 읽을 때나 같은 문자열을 회문 문자열이라고 합니다.
문자열이 입력되면 해당 문자열이 회문 문자열이면 "YES", 회문 문자열이 아니면 “NO"를 출력하는 프로그램을 작성하세요.
    // 단 대소문자 구분 X
 *  1)     대소문자 구분안하니까 일단 전부 통일시켜주기 (대문자로)
 *  2)  _ _ _ _ _  (i < len/2) 인 동안 반복
 *  3) 대칭하는 애들끼리 비교하면 됨
 * */
public class Main3 {
    //솔루션 함수 (1) 
    public String solution(String str) {
        String answer = "YES";
        //대소문자 구분X => 통일시켜주기
        str = str.toUpperCase();
        int len = str.length();

        for(int i = 0; i <len/2; i++) {
            // 0 1 2 3 이면 0과 3, 1과 2가 비교되어야 함 
            if(str.charAt(i) != str.charAt(len-i-1)) return "NO";
        }
        return answer;
    }
    //솔루션 함수 (2) 
    public String solution2(String str) {
        String answer = "NO";
        //reverse 해준 애가 처음이랑 같아도 회문 문자열
        String tmp = new StringBuilder(str).reverse().toString(); //뒤집고
        if(str.equalsIgnoreCase(tmp)) answer = "YES";    
        return answer;
    }
    //메인 함수
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Main3 T = new Main3();
        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-8. 팰린드롬 | replaceAll () 이용

/* 1-8. 유효한 팰린드롭
 * 앞에서 읽을 때나 뒤에서 읽을 때나 같은 문자열을 팰린드롬이라고 합니다.
문자열이 입력되면 해당 문자열이 팰린드롬이면 "YES", 아니면 “NO"를 출력하는 프로그램을 작성하세요.
단 회문을 검사할 때 알파벳만 가지고 회문을 검사하며, 대소문자를 구분하지 않습니다.
알파벳 이외의 문자들의 무시합니다.
*/
public class Main4 {
    //솔루션 함수
    public String solution(String str) {
        String answer = "NO";
        // 1) 대소문자 통일 + 알파벳 제외 글자는 모두 "" 공백으로 대체해라
        // 알파벳만 검사해야 하므로
        str = str.toUpperCase().replaceAll("[^A-Z]", "");
        // 2) reverse 시키기 
        String tmp = new StringBuilder(str).reverse().toString();
        //3) 처음 vs reverse 시킨 것 비교할 것 
        if(str.equals(tmp)) answer = "YES";

        return answer;
    }

    //메인 함수 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Main4 T = new Main4();
        Scanner kb = new Scanner(System.in);

        //1) 입력
        String str = kb.nextLine(); 
        //2) 출력
        System.out.println(T.solution(str));
    }
}
728x90