프로그래밍/JAVA 프로그래밍

[코딩연습_JAVA] 괄호 문자 제거

Dream COM Ddulut 2024. 2. 20. 00:25
[간단 문제 설명]
입력된 문자열에서, 소괄호 내에 있는 문자를 제거하고 남은 문자만 출력하도록 한다.

 

 

 

솔루션 코드는 아래와 같다. ↴

   public String solution(String s){
       Stack<Character> stack=new Stack<>();
        char tmp=' ';
       for(char x: s.toCharArray()){
           stack.push(x);//')'가 나올때까지 push한다.
           if(x==')'){
               do{
                   tmp=stack.pop();
                   if(stack.isEmpty()) break; //문자열 첫 문자가 ')'일 경우.
                 }while(tmp!='('); //'('가 나올때까지 pop.
           }
       }
       char[] carray=new char[stack.size()]; //stack 내(內) 문자를 저장할 배열
       
       for(int i=0; i<stack.size(); i++){ //배열에 stack 안에 있는 문자를 맨 처음 입력된 문자부터 순서대로 저장
           carray[i]=stack.get(i);
       }

       return String.valueOf(carray); //문자 배열을 문자로 변환하여 반환.
   }

 

 

 

기본적인 아이디어:

  1. ')'가 나올 때까지 문자를 stack에 .push()한다.
  2. 만약 ')' 가 나오면, '('가 나올 때 까지 .pop()한다.
  3. 문자열 전체를 대상으로 1,2번을 반복한다.
  4. 남은 문자를 문자열로 변환하여 반환한다.

*** ')'를 만난 후 .pop()메서드를 실행할 때 꼭!!! '('를 남겨두지 않고 모두 제거해줘야한다!

 


 

 

이번 문제는 생각보다 쉽게 해결해서 뿌듯했다. 

 

하지만 문제 풀이 후 강의를 보니, 내 코드에 대해 아쉬운 점들이 많이 보였다.

 

코드를 다시 한 번 다듬어보자.

 

 

① 6~11번 줄

 if(x==')'){
               do{
                   tmp=stack.pop();
                   if(stack.isEmpty()) break; //문자열 첫 문자가 ')'일 경우.
                 }while(tmp!='('); //'('가 나올때까지 pop.
           }

↪ 굳이 문자를 저장하는 변수 tmp를 선언하여 stack.pop()의 값을 저장하여 이용했다.

 

 

while()문에서 조건식만 잘 활용해도 불필요한 변수를 선언하지 않을 수 있다.  

 if(x==')'){
               while(stack.pop()!='('){ //'('가 나올때까지 pop.
                   if(stack.isEmpty()) break; //문자열 첫 문자가 ')'일 경우.
                 }
           }

 

 

필자는 위에서 문자열 첫 문자가 ')'일 경우까지 고려했지만,

만약 문자열의 첫 문자가 절대로 ')'부터 시작하지 않는다면 더 깔끔하게 정리할 수 있다.

 if(x==')') while(stack.pop()!='('); //'('가 나올때까지 pop.

 

 

***while문에서 반복할 내용을 꼭 넣지않아도 된다는 것, 조건식만도 활용 가능하다는 것을 처음 깨달았다.

 

 

 

② 13~19번 줄

       char[] carray=new char[stack.size()];
        
       for(int i=0; i<stack.size(); i++){
           carray[i]=stack.get(i);
       }

       return String.valueOf(carray);

↪ stack 내(內) 문자를 저장하기 위해 배열을 선언하고, 배열을 String으로 변환하는 방법을 사용하였다.

 

 

배열이 아니라 String 변수를 선언하고 활용할 수도 있다. ↴

       String answer=' ';
        
       for(int i=0; i<stack.size(); i++){
          answer+=stack.get(i);
       }

       return answer;

 


 

수정한 솔루션 코드

   public String solution(String s){
       Stack<Character> stack=new Stack<>();
       char tmp=' ';
       
       for(char x: s.toCharArray()){
           stack.push(x);   //')'가 나올때까지 push한다.
		   if(x==')'){
               while(stack.pop()!='('){   //'('가 나올때까지 pop.
                   if(stack.isEmpty()) break;   //문자열 첫 문자가 ')'일 경우.
                 }
           }
       String answer=' ';
       for(int i=0; i<stack.size(); i++){
          answer+=stack.get(i);
       }

       return answer;
   }