문제

Given a string s containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid.

An input string is valid if:

  1. Open brackets must be closed by the same type of brackets.
  2. Open brackets must be closed in the correct order.

Valie Parentheses 문제는 전형적인 stack문제이다. 오늘 가볍게 스택을 공부하며 익힌것을 코드에 적용해볼 수 있는 기회였다.

따봉 코드

public boolean isValid(String s) {
        
        Stack<Character> stack = new Stack<>();
        
        for(char ch: s.toCharArray()) {
            if(ch == '(' || ch == '{' || ch == '[') {
                stack.push(ch);
            } else if(!stack.isEmpty()){
                if(ch == ')' && stack.peek() == '(' ||
                   ch == '}' && stack.peek() == '{' ||
                   ch == ']' && stack.peek() == '[' ) {
                    stack.pop();
                } else {
                    return false;
                }
            } else {
                stack.push(ch);
            }
        }
        return stack.isEmpty();
    }
public boolean isValid(String s) {
	Stack<Character> stack = new Stack<Character>();
	for (char c : s.toCharArray()) {
		if (c == '(')
			stack.push(')');
		else if (c == '{')
			stack.push('}');
		else if (c == '[')
			stack.push(']');
		else if (stack.isEmpty() || stack.pop() != c)
			return false;
	}
	return stack.isEmpty();
}

나의 구현 코드

public static boolean isValid(String s) {
        Stack<Character> par1 = new Stack<Character>();

        for(int i=0; i< s.length(); i++){
            char c = s.charAt(i);
            if(c=='(' || c=='[' || c== '{')
                par1.push(c);
            else{
                if(par1.size() > 0 &&((c==')' && par1.peek() == '(')
                        || (c==']' && par1.peek() == '[')
                || c=='}' && par1.peek() == '{')){
                    par1.pop();
                } else return false;
            }
        }
        if(par1.size() == 0) return true;
        return false;

    }

쉬운 문제라서 바로바로 풀긴 했지만, 코드를 조금 더 간결하게 작성하는 방법을 익히자!

그리고 더 나아질 수 있을 만한 점 :

  • for구문을 돌 때 인덱스로 character 접근하지 말고 char c : s.toCharArray()로 한 번에 접근하기
  • 마지막 리턴시 size()로 판단하지 말고 isEmpty()로 한 번에 조회하기 ==> 사상은 동일한데, 뭔가 isEmpty()가 더 가독성이 좋은 느낌?

oksusutea's blog

꾸준히 기록하려고 만든 블로그