728x90
반응형
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;
}
}
728x90
반응형
'Java > Java 알고리즘 인프런' 카테고리의 다른 글
Java 형변환 정리 (0) | 2022.05.20 |
---|---|
[Ch.05 - StackQueue] 03. 크레인 인형뽑기(카카오) (0) | 2022.05.20 |
[Ch.05 - StackQueue] 01. 올바른 괄호 (0) | 2022.05.20 |
[Ch.04 - HashTree] 03. 매출액의 종류 # (0) | 2022.05.19 |
[Ch.04 - HashTree] 02. 아나그램(해쉬) (+ 삼항연산자) (0) | 2022.05.19 |