🙈

⃝ 동글동글 ⃝

🪐ᐩ˖ 🍎

CodingTest/Programmers

[프로그래머스/Programmers] 올바른 괄호 (Java - Stack - Level2)

JONG_UK 2023. 1. 17. 16:11
728x90
반응형
SMALL

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


⭐️ 코드

boolean solution(String s) {
    if(s.length() == 0 || s.length()%2 != 0 || s.charAt(0) == ')' || s.charAt(s.length()-1) == '(') {
        return false;
    }
    ArrayDeque<Character> stack = new ArrayDeque<>();
    for(int i = 0; i<s.length(); i++) {
        char c = s.charAt(i);
        if(c == ')') {
            if(stack.size() < 1) {
                return false;
            }
            stack.pop();
        } else {
            stack.addLast(c);
        }
    }
    return (!stack.isEmpty()) ? false : true;
}

💡 문제 풀이

String s ="()())(()";

테스트 케이스 5번 11번에서 자꾸 막힌다면 위 테스트 케이스를 직접 돌려보자.

stack이 비었는데 pop() 연산을 해서 런타임 에러가 뜨는 것이다.

 

효율성 부분에서는 Character 형을 쓰는 것이 성공했다. split() 함수는 쓰면 안 되는 걸까?

 

첫 번째 풀이
boolean solution(String s) {
    boolean answer = true;

    if(s.charAt(0) == ')' || s.charAt(s.length()-1) == '(') {
        return false;
    }

    ArrayDeque<String> stack = new ArrayDeque<String>();
    String[] sArr = s.split("");

    int a = 0;
    int b = 0;

    for(String item : sArr) {
        stack.addLast(item);
        if(")".equals(item)) {
           a++;
        } else {
            b++;
        }
    }
    if(a==b) {
        answer = true;
    }

    return answer;
}

 두 번째 풀이
boolean solution(String s) {
    boolean answer = true;

    if(s.charAt(0) == ')' || s.charAt(s.length()-1) == '(') {
        return false;
    }

    ArrayDeque<String> stack = new ArrayDeque<String>();
    String[] sArr = s.split("");

    for(String item : sArr) {
        if(item.equals(")")) {
            stack.pop();
        } else {
            stack.addLast(item);
        }
    }
    if(!stack.isEmpty()) {
        return false;
    } else {
        return true;
    }
}

 

세 번째 풀이 (효율성 통과)
boolean solution(String s) {
    boolean answer = true;
    if(s.length() == 0 || s.length()%2 != 0 || s.charAt(0) == ')' || s.charAt(s.length()-1) == '(') {
        return false;
    }
    ArrayDeque<Character> stack = new ArrayDeque<>();
    for(int i = 0; i<s.length(); i++) {
        char c = s.charAt(i);
        if(c == ')') {
            stack.pop();
        } else {
            stack.addLast(c);
        }
    }

    if(!stack.isEmpty()) {
        return false;
    } else {
        return true;
    }
}

성공한 풀이
boolean solution(String s) {
    if(s.length() == 0 || s.length()%2 != 0 || s.charAt(0) == ')' || s.charAt(s.length()-1) == '(') {
        return false;
    }
    ArrayDeque<Character> stack = new ArrayDeque<>();
    for(int i = 0; i<s.length(); i++) {
        char c = s.charAt(i);
        if(c == ')') {
            if(stack.size() < 1) {
                return false;
            }
            stack.pop();
        } else {
            stack.addLast(c);
        }
    }
    return (!stack.isEmpty()) ? false : true;
}


👀 후기

망할 테스트케이스...

728x90
반응형
LIST