개발 공부~

[문자열] 특정 문자 뒤집기 .java 본문

코딩테스트/기타

[문자열] 특정 문자 뒤집기 .java

머밍 2024. 9. 7. 15:39

설명

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

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

입력

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

출력

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

예시 입력 1 

a#b!GE*T@S

예시 출력 1

S#T!EG*b@a

 

 

내 풀이

알파벳과 특수문자로만 구성된 문자열에서 알파벳만 뒤집고 특수문자는 그대로 있어야한다

  • 알파벳 뒤집기 = FILO -> 스택 이용
  • 알파벳인지 확인 -> Character.isAlphabetic(검사할문자) 이용
  • 알파벳이면 스택에 push, 특수문자면 변화 없음
  • 알파벳 자리이면 스택에서 pop하여 배열 갱신
import java.util.Scanner;
import java.util.Stack;

public class Main {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);

        char[] chars = sc.nextLine().toCharArray();//한글자씩 배열에
        
        Stack<Character> stack = new Stack<Character>();//알파벳만 담을 스택

        for(int i=0; i<chars.length; i++){
            if(Character.isAlphabetic(chars[i])){//알파벳이면
                stack.push(chars[i]);//스택에 넣고
            }
        }

        for (int i = 0; i < chars.length; i++) {
            if (Character.isAlphabetic(chars[i])) {//알파벳이 들어갈 자리면
                chars[i] = stack.pop();//맨 마지막에 들어간 알파벳부터 저장 -> 뒤집기
            }
        }

        System.out.println(String.valueOf(chars));//문자열형태로 출력
    }
}

 

 

다른 풀이 - 투 포인터

lt(left)는 0, rt(right)는 인덱스 마지막(길이 -1)

-> lt < rt 일때

-> 각 가리키는 문자 모두 알파벳이면 서로 교환후 lt 하나 증가, rt 하나 감소

-> 만약 특수문자면 다음으로 이동

 

import java.util.Scanner;

public class Main {
    public String solution(String str){
        char[] chars = str.toCharArray();//문자열 -> 문자 배열
        int lt = 0;
        int rt = chars.length - 1;

        while(lt < rt) {
            if(!Character.isAlphabetic(chars[lt])) {//특수문자이면
                lt++;//lt 증가
            } else if(!Character.isAlphabetic(chars[rt])) {
                rt--;
            } else{
                //알파벳 서로 교환
                char tmp = chars[lt];
                chars[lt] = chars[rt];
                chars[rt] = tmp;
                //다음으로 이동
                lt++;
                rt--;
            }
        }

        return String.valueOf(chars); //문자열로 반환
    }
    public static void main(String[] args){
        Main T = new Main();
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        System.out.println(T.solution(str));
    }
}

 

 

💡

스택만 생각났었는데 투 포인터로 풀 수 있구나를 알게해준 문제다

이후 스택을  StringBuilder로 대신할 수 있다는 것도 생각나서 구현해봤다

import java.util.Scanner;

public class Main {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);

        char[] chars = sc.nextLine().toCharArray();//한글자씩 배열에

        StringBuilder stack = new StringBuilder();//알파벳을 저장할 StringBuilder

        for(int i=0; i<chars.length; i++){
            if(Character.isAlphabetic(chars[i])){//알파벳이면
                stack.append(chars[i]);//스택 역할: 알파벳을 저장
            }
        }

        // 뒤집어진 알파벳을 저장할 인덱스
        int idx = stack.length() - 1;

        for (int i = 0; i < chars.length; i++) {
            if (Character.isAlphabetic(chars[i])) {//알파벳 자리면
                chars[i] = stack.charAt(idx--);//뒤집어서 저장
            }
        }

        System.out.println(String.valueOf(chars));
    }
}