본문 바로가기

Java/Java 알고리즘 인프런

[Ch.05 - StackQueue] 02. 괄호문자제거

반응형
2. 괄호문자제거
 

설명

입력된 문자열에서 소괄호 ( ) 사이에 존재하는 모든 문자를 제거하고 남은 문자만 출력하는 프로그램을 작성하세요.

입력

첫 줄에 문자열이 주어진다. 문자열의 길이는 100을 넘지 않는다.

출력

남은 문자만 출력한다.

 

예시 입력 1 

(A(BC)D)EF(G(H)(IJ)K)LM(N)

예시 출력 1

EFLM

문제 풀이 세 가지 방법

1. 괄호 상관없이 모두 넣고, 닫는 괄호가 나오면, 여는 괄호가 나올 때까지 pop

2. 괄호만 스택에 넣고, 스택이 비어있을 때만, 문자열에 추가

3.

import java.util.*;

public class Main {
	public Stack<Character> solution(String str) {
		Stack<Character> stack = new Stack<>();
		char[] arr = str.toCharArray();
		for (int i = 0; i < arr.length; i++) {
			if (arr[i] == ')') {
				while (stack.pop() != '(');
					
			} else
				stack.push(arr[i]);
		}
		return stack;
	}

	public static void main(String[] args) {
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		String str = kb.next();
		for (Character x : T.solution(str)) {
			System.out.print(x);
		}
	}
}

-> 닫는괄호가 아니면 모두 추가 한 후 여는 괄호가 나올때까지 모두 제거

while (stack.pop() != '(');

-> while문을 한줄로 쓸때에는 ';' 필요

 

출력만 하는 방법이 아니라, StrinBuilder를 이용해 문자열로 조합

import java.util.Scanner;
import java.util.Stack;

public class Main {
	public String solution(String str) {
		String answer=" ";
		Stack<Character> stack =new Stack<>();
		char[] arr = str.toCharArray();
		for(int i=0;i<arr.length;i++) {
			if(arr[i]==')') {
				while(stack.pop()!='(');
			}
			else
				stack.push(arr[i]);
		}
		
		StringBuilder sb= new StringBuilder();
		while(!stack.isEmpty()) sb.append(stack.pop());
		
		return answer=sb.reverse().toString();
	}
	public static void main(String[] args) {
		Main T= new Main();
		Scanner kb = new Scanner(System.in);
		String str=kb.next();
		System.out.println(T.solution(str));
	}

}

 

 

package stackqueue.ch05_2;

import java.util.Scanner;
import java.util.Stack;

//괄호문자제거
public class Stackqueue02 {
	public String solution(String str) {
		String answer = " ";
		StringBuilder sb= new StringBuilder();
		Stack<Character> stack = new Stack<>();
		char[] arr = str.toCharArray();
        
		for (int i = 0; i < arr.length; i++) {
			if (arr[i] == '(') stack.push(arr[i]);
			else if (arr[i]==')') stack.pop();
            
			if(stack.isEmpty()&&arr[i]!='('&&arr[i]!=')')
				sb.append(arr[i]);
		}

		return answer=sb.toString();
	}

	public static void main(String[] args) {
		Stackqueue02 T = new Stackqueue02();
		Scanner kb = new Scanner(System.in);
		String str = kb.next();
		System.out.println(T.solution(str));
	}

}

-> 모두 추가하고 제거하는 과정없이, 괄호가 아닐 경우만 문자열에 추가

 

 

 

+) 세련된 코드 -> for문에서 arr[i]를 :로 변경

package stackqueue.ch05;

import java.util.Scanner;
import java.util.Stack;

public class Stackqueue02 {
	//괄호문자제거
	//소괄호 사이에 존재하는 모든 문자를 제거하고 남은 문자만 출
	
	public static void main(String[] args) {
		Stackqueue02 T = new Stackqueue02();
		Scanner kb = new Scanner(System.in);
		String str = kb.next();
		System.out.println(T.solution(str));
		kb.close();
	}
	
	public String solution(String str) {
		String answer ="";
		Stack <Character> stack = new Stack<>();
		
		for(char x : str.toCharArray()) {
			if(x==')') {
				while(stack.pop()!='(');
				//문자가 닫는 괄호일 경우 여는 괄호가 나올때까지 모든 문자를 제거한다.
			}
			else stack.push(x);
			//닫는 괄호가 아닐경우 모두 추가
		}
		for (int i=0;i<stack.size();i++) {
			answer +=stack.get(i);
			//i는 0부터 스택의 길이만큼 반복하는데 결과는 스택에서 하나씩 가져온다.
		}
		return answer;
	}

}

 

 

# 스택을 순서대로 두 가지 방법으로 출력

package stackqueue.ch05_2;

import java.util.Scanner;
import java.util.Stack;

//1. stack을 get을 이용해 순서대로 출력
//2. stack을 메서드 이용하지 않고 순서대로 출력
public class Stackqueue02_3 {
	public void solution(String str) {
		Stack <Character> stack=new Stack<>();
		for(char x:str.toCharArray()) {
			if(x==')') {
				while(stack.pop()!='(');
			}
			else
				stack.push(x);		
		}
		//1
		for(char x:stack) System.out.print(x);
		
		System.out.println();
		
		//2
		for(int i=0;i<stack.size();i++) System.out.print(stack.get(i));
	}
	public static void main(String[] args) {
		Stackqueue02_3 T=new Stackqueue02_3();
		Scanner kb= new Scanner(System.in);
		String str=kb.next();
		T.solution(str);
	}

}

import java.util.*;
  
public class Main {
  public static void main(String[] args){
    Scanner in=new Scanner(System.in);
    String str= in.next();
    System.out.println(Solution(str));
  }
  private static String Solution(String str){
    String answer="";
    Stack<Character> stack = new Stack<>();

    for(char c:str.toCharArray()){
      if(c=='(') stack.push(c);
      else if(!stack.isEmpty()&&stack.peek()=='(' && c==')') stack.pop();
      else if(stack.isEmpty()) answer+=c;
    }
    
    return answer;
  }
}
반응형