ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 알고리즘 문제 - 특정 문자 뒤집기
    Java 알고리즘 문제/자바(Java) 알고리즘 문제풀이 입문 2023. 5. 17. 23:08
    반응형

    특정 문자 뒤집기

    설명

    영어 알파벳과 특수문자로 구성된 문자열이 주어지면 영어 알파벳만 뒤집고,

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

     

    입력

    첫 줄에 길이가 100을 넘지 않는 문자열이 주어집니다.

     

    출력

    첫 줄에 알파벳만 뒤집힌 문자열을 출력합니다.

    Ex) a#b!GE*T@S -> S#T!EG*b@a

     

    문자배열을 만든다 순서대로 0번째부터 인덱스를 가진다. lt -> left, rt -> right

    lt와 rt가 모두 문자라면 

    lt가 특수문자라면 lt+

    rt가 특수문자라면 rt-

    둘다 아니라면 둘다 알파벳을 가르키게 된다.

     

     

    package chap1;
    
    import java.util.Scanner;
    
    public class Ex01_solution {
        public String ch1_solution(String str){
            String answer;
            char[] s= str.toCharArray(); //문자 배열 생성
            int lt = 0;
            int rt = str.length() -1; // 입력받은 문자열의 길이를 정해두지 않아서 length -1로 사용
            while(lt < rt){
                if(!Character.isAlphabetic(s[lt])){ //알파벳이 아닐때
                    lt++;
                }else if(!Character.isAlphabetic(s[rt])){
                    rt--;
                }else{
                    char tmp = s[lt];
                    s[lt] = s[rt];
                    s[rt] = tmp;
                    lt++;
                    rt--;
                }
            }
    
            //문자열 배열을 가공한 작업이 완료
            answer=String.valueOf(s); //문자열로 변환
    
            return answer;
        }
        public static void main(String[] args) {
            Ex01_solution T = new Ex01_solution();
            Scanner kb = new Scanner(System.in);
            String str = kb.next();
            System.out.println(T.ch1_solution(str));
        }
    }

     

     

            Ex01_solution T = new Ex01_solution();
            Scanner kb = new Scanner(System.in);
            String str = kb.next();
            System.out.println(T.ch1_solution(str));

     

     

    Scanner를 통해 입력을 받고 str에 값을 넣어 값을 전달한다.

     

    public String ch1_solution(String str){

    Scanner를 통해 a#b!GE*T@S 해당 문자열을 입력한다면 ch1_solution의 매개변수에 전달이된다.

    String answer;
    char[] s= str.toCharArray(); //문자 배열 생성
    int lt = 0;
    int rt = str.length() -1; 

    전달받은 str을 char[]배열을 생성하여 담아준다.

    a # b ! G E * T @ S

    이때 lt 는 left, rt 는 right를 의미한다. 

    rt의 경우 입력받은 문자열의 길이를 알지 못하므로 length(-1)을 해주었다.

     

    while(lt < rt){
        if(!Character.isAlphabetic(s[lt])){ //알파벳이 아닐때
            lt++;
        }else if(!Character.isAlphabetic(s[rt])){
            rt--;
        }else{
            char tmp = s[lt];
            s[lt] = s[rt];
            s[rt] = tmp;
            lt++;
            rt--;
        }
    }

    이제 해당 문자열을 돌면서 영어 알파벳만 뒤집고 특수문자는 그대로 두어야하기때문에 while문을 통하여 char[]을 탐색한다. 이때 알파벳을 검색하는 기능으로는 Character.isAlphabetic()을 사용해주자

    맨처음에는 lt의 값이 0 이므로 0번째에 해당하는 a을 탐색하게 된다. 

     

    이때 a는 알파벳이기때문에 else if로 이동하고  rt의 경우도 알파벳이기 때문에 else구문으로 이동한다.

    char tmp를 만들어 둔 후에 s[lt] => a 값을 tmp에 넣어준다.

    s[lt] -> s[0] s[rt] -> s[9] tmp
    a S a

    해당 상태에서 s[lt] 에 s[rt]값을 대입해준다. 그러면 아래와 같은 표가 된다.

    s[lt] -> s[0] s[rt] -> s[9] tmp
    S S a

    그런 후에 s[rt]에 s[lt]을 값을 미리 저장해두었던 tmp값을 대입한다.

    s[lt] -> s[0] s[rt] -> s[9] tmp
    S a a

    이와같이 각 인덱스에서 알파벳을 찾는다면 그 인덱스에 해당하는 rt와 lt값을 맞바꿔준다.

     

     

     

     

    반응형

    댓글

Designed by Tistory.