Stack(2)

배지원·2022년 10월 22일
0

알고리즘

목록 보기
6/16

이전에 했던 프로그램에 이어 스택활용 알고리즘을 풀어보겠다.
이전 프로그램 정리 : https://velog.io/@qowl880/Stack

1. 정의

  • 이전에는 Stack을 직접 push, pop, peek, isEmpty등을 추가하여 직접 메서드를 작성하여 구현했다면 이번에는 Stack클래스를 이용하여 구현해보록 한다.

2. 실습

1. Stack 클래스

  • 괄호 문자열"(())"처럼을 입력받아 스택을 통해 정상적인 괄호 방식을 구분한다
public class StackBracket {
    boolean answer(String s){
        Stack<Character> stack = new Stack<>();

        for(int i =0; i<s.length(); i++) {
            char c = s.charAt(i);

            if(c=='(')     // (입력시 stack 저장
                stack.push(c);
            else if(stack.empty()) {     // 만약 스택이 비어있는 상태에 )입력시 false 출력
                return false;
            }
            else            // (있는 상태에서 )입력시 pop
                stack.pop();
        }
        return stack.empty();
    }
}
  • 입력한 값을 순서대로 저장할 수 있도록 스택 리스트를 선언한다.
  • 문자열을 1자리씩 스택에 넣기 위해 charAt을 통해 모든 문자열을 문자화 시킨다.
  • 만약 열림 괄호 '('를 입력받으면 스택에 넣는다
  • 스택이 비어있는 상태에서 ')'를 입력하게 되면 올바른 괄호가 아니기 때문에 false를 반환한다.
  • 스택이 차여있는 상태 즉, '('가 있는 상태에서 ')'를 읽게 되면 가장 최근에 들어간 '('를 빼내준다.
  • 최종적으로 스택이 비어있다면 정상적으로 짝이 맞춰진 괄호이므로 true를 반환해준다.

TDD

class bracketTest {

    @Test
    @DisplayName("괄호가 잘 풀리는지")
    void bracket(){
        bracket sb = new bracket();
        assertFalse(sb.result("()())"));
        assertFalse(sb.result(")()()("));
        assertTrue(sb.result("()()"));
        assertTrue(sb.result("((()()))"));
        assertTrue(sb.result("((((((((((()))))))))))"));
        assertFalse(sb.result("(()("));
    }
}
profile
Web Developer

0개의 댓글