올바른 괄호 | 프로그래머스

Bluewave·2024년 8월 11일

코테공부_java

목록 보기
49/99
post-thumbnail

문제

🩶 문제 바로가기

문제레벨정답률
올바른 괄호Lv.278%

My Code

import java.util.*;

class Solution {
    boolean solution(String s) {
        boolean answer = true;
        Stack<Character> stack = new Stack<>();
        
        for(int i = 0; i<s.length(); i++){
            if(s.charAt(i) == '('){
                stack.push(s.charAt(i));
            }else{
                if(stack.isEmpty()){
                    answer = false;
                    break;
                } else{
                    stack.pop();
                }
            }
        }
        
        if(!stack.isEmpty()){ //마지막 case 고려
            answer = false;
        }
        
        return answer;
    }
}
  1. 문자열만큼 반복문 돌면서 '('일 경우 스택에 push
  2. 그게 아니라면 스택 isEmpty 여부를 따짐
    스택이 비어있는데 ')'가 들어온 상황이라면 false,
    스택에 '('가 존재한다면 pop 시켜줌
  3. 최종적으로 스택이 비어있지 않다면 false 처리

처음에는 마지막 if문을 넣지 않고 돌렸는데, 한두개의 테스트 케이스에서 걸려서 오답처리 되었다.
이유는 ((()( 와 같은 케이스 때문,,
ㄴ '('가 더 많아서 반복문이 끝나도 스택이 비어있지 않기 때문에 마지막으로 한 번 더 고려를 해줘야 했다.


최적화 코드

import java.util.Stack;

class Solution {
    boolean solution(String s) {
        Stack<Character> stack = new Stack<>();
        
        for (char c : s.toCharArray()) {
            if (c == '(') {
                stack.push(c);
            } else if (c == ')') {
                if (stack.isEmpty()) {
                    return false; // 닫는 괄호가 여는 괄호 없이 나타났을 때
                }
                stack.pop();
            }
        }
        
        return stack.isEmpty(); // 모든 괄호가 올바르게 닫혔는지 확인
    }
}

개선점

  1. answer 변수 제거 -> return 값 바로 설정
  2. toCharArray() 사용 -> 문자열을 char 배열로 변환하여 가독성 up
  3. 불필요한 코드 제거

우선 가장 크게 달라진 점은 마지막에 if문으로 비어있는지를 확인하던 부분이 return 안으로 들어가 간소화 되었다는 점!

toCharArray() 🫧

String 클래스의 메서드
문자열을 char 배열로 변환하는 기능 제공

String str = "Hello, world!";
char[] charArray = str.toCharArray();

for (char c : charArray) {
    System.out.println(c);
}

평소 나는 문자열을 for문으로 돌 경우, charAt() 메서드를 활용하여 앞에서부터 찾아나가는 방식으로 사용했었다.
물론 성능 측면에서는 charAt()을 사용하는게 메모리 차원에서 이득일 수는 있지만 가독성이 떨어지고 문자열에 직접적인 영향을 준다는 단점도 있다.
toCharArray() 메서드는 존재만 알고 사용해본 적이 없었는데 앞으로 문자열을 for문으로 돌때는 적극 활용해봐야겠다.


전체적으로 문제는 굉장히 간단했지만 평소 잘 쓰지 않던 Stack을 다시 한 번 연습해볼 수 있어서 좋았고, 새로운 메서드를 접할 기회가 되어 good ~,~
쉬운 문제도 다시 보자,,

profile
Developer's Logbook

0개의 댓글