ezhoon

[인프런] 05_02 괄호문자제거 본문

[Java] 인프런 문제풀이/Stack, Queue (자료구조)

[인프런] 05_02 괄호문자제거

ezhoon 2022. 1. 27. 10:55

📖  문제


  • 첫 줄에 문자열 입력
    • 소괄호 사이에 존재하는 모든 문자 제거하고 남은 문자만 출력하시오

출력 예시

 

 

⚠️  주의사항


  • '(' 괄호가 여러 개 나오고서 ')' 괄호 나올 때를 생각해야 합니다.
  • 괄호 사이가 아닌 경우에는 그대로 stack에 유지하거나 다른 변수에 저장해야 합니다.

✍️  이해


이번엔 두 가지로 나눴습니다.

 

먼저 제가 처음에 풀었던 방법이지만 비추하는 방법입니다. 코드로 풀어보면 너무 길고, 직관적이지가 않습니다.

/**
 * 1. 첫 줄에 문자열 str 생성
 * 2. 소괄호 사이에 존재하는 모든 문자 제거이므로 "(" 입력 받으면 ")" 받을 때 까지 모든 문자 제거
 *  2-1. "(" 다음 "(" 더 들어오고 ")" 여러 개 있는 경우도 생각하므로
 *  2-2. "(" 받을 때 마다 cnt++ 하고 ")"도 cnt2 누적 후 동일 할 때 문자 삭제
 *  2-3. 위에 조건문 빠져나올때마다 문자 answer에 누적
 * 3. return answer;
 */

위에 코드의 단점을 보완한 풀이 방법입니다.

/**
 * 1. 첫 줄에 문자열 str 생성
 * 2. 문자열 stack 추가
 *  2-1. 문자열이 ')' 인 경우
 *   2-1-1. '(' 여는 괄호 만날때 까지 pop
 *  2-2. 알파벳인경우 push
 * 3. for each 구문으로 answer에 stack 값 누적
 * 4. return answer
 */

✏️  풀이


따로 찾아보지 않고 풀어본 방법이지만 for문 안의 if문이 너무 쓸데없이 많은 것 같아 아래에 보완 코드가 있습니다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;

public class Java05_02 {

    public String solution(String str) {

        String answer = "";

        Stack<Character> stack = new Stack<>();

        int cnt = 0, cnt2= 0;
        for (char c : str.toCharArray()) {
            if(c == '('){
                cnt++;
            } else if (c == ')') {
                cnt2++;
                if (cnt == cnt2 && cnt2 != 0) {
                    cnt = 0;
                    cnt2 = 0;
                }
            } else {
                if( cnt == 0) answer = answer + c;
                stack.push(c);
            }
        }

        return answer;
    }

    public static void main(String[] args) throws IOException {

        Java05_02 T = new Java05_02();

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();

        System.out.println(T.solution(str));
    }
}

 

단점 보완코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;

public class Main {

    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 (Character character : stack) answer += character;


        return answer;
    }


    public static void main(String[] args) throws IOException {

        Main T = new Main();

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();

        System.out.println(T.solution(str));
    }
}

 

 

Comments