티스토리 뷰

 

4949번: 균형잡힌 세상

하나 또는 여러줄에 걸쳐서 문자열이 주어진다. 각 문자열은 영문 알파벳, 공백, 소괄호("( )") 대괄호("[ ]")등으로 이루어져 있으며, 길이는 100글자보다 작거나 같다. 입력의 종료조건으로 맨 마��

www.acmicpc.net

2020년 코딩 테스트 문제와 비슷하여 풀어보았다.

처음 생각 - 괄호 개수

문제를 읽어보면 stack을 사용해야 한다고 느껴진다.

하지만 괄호 개수만 체크하면서 풀 수 있지 않을까 생각이 들었다.

private static boolean isCheckString(String str) {
  int small = 0;
  int big = 0;
  for(int i = 0 ;i<str.length();i++) {
    char ch =str.charAt(i);
    if(ch == '('){
      small++;
    } else if(ch == '['){
      big++;
    } else if(ch == ')'){
      if(small == 0) return false;
      small--;
    }else if(ch == ']'){
      if(big == 0) return false;
      big--;
    }
	}
	if(big != 0 || small != 0) {
    return false;
  }
  return true;
}

하지만 문제를 자세히 읽어보면 괄호의 짝이 맞아야한다.

무슨 말이냐면 최근 괄호가 '('라면 ']'가 나오면 "no"를 출력해야 한다.

역시 스택 ❗

private static boolean isCheckString(String str) {
    Stack<Character> stack = new Stack<>();
    for (int i = 0; i < str.length(); i++) {
      char ch = str.charAt(i);
      if (ch == '(' || ch == '[') {
        stack.push(ch);
      } else if (ch == ')') {
        if (stack.isEmpty() || stack.peek() != '(') {
          return false;
        }
        stack.pop();
      } else if (ch == ']') {
        if (stack.isEmpty() || stack.peek() != '[') {
          return false;
        }
        stack.pop();
      }
    }
    if (!stack.isEmpty()) {
      return false;
    }
    return true;
  }

문제를 정확히 보면 틀릴 일이 없다!

주의사항 ⛔

stack이 비어있는지 꼭 확인(stack.isEmpty())해줘야 한다.

전체 코드

/**
 * @처음생각 괄호의 수만 맞으면 된다 생각해서 big, small Integer 변수를 선언하였다.
 * @포인트 stack에 넣어줌으로써 top()에 있는 괄호의 짝이 맞는지 확인해줘야 한다.
 */
import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Main {
  public static void main(String[] args) throws java.lang.Exception {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    while (true) {
      String str = br.readLine();
      if (str.equals(".")) {
        break;
      }
      if (isCheckString(str)) {
        System.out.println("yes");
      } else {
        System.out.println("no");
      }
    }
  }

  private static boolean isCheckString(String str) {
    Stack<Character> stack = new Stack<>();
    for (int i = 0; i < str.length(); i++) {
      char ch = str.charAt(i);
      if (ch == '(' || ch == '[') {
        stack.push(ch);
      } else if (ch == ')') {
        if (stack.isEmpty() || stack.peek() != '(') {
          return false;
        }
        stack.pop();
      } else if (ch == ']') {
        if (stack.isEmpty() || stack.peek() != '[') {
          return false;
        }
        stack.pop();
      }
    }
    if (!stack.isEmpty()) {
      return false;
    }
    return true;
  }
}
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함