Programmers

[ 프로그래머스 ] 올바른 괄호 - Java

giggs 2023. 1. 19. 14:25

 

1. 문제 설명

 

 

 

 


 

2. 문제 풀이 핵심이라 생각하는 점

  • stack의 개념 :가장 최근에 들어간 데이터가 가장 먼저 나오는 후입선출(Last In First Out)의 구조
  • stack 함수 : push(), pop(), imEmpty()
  • 닫는 괄호로 시작하는 경우 처리 필요 ( 비정상적으로 시작하는 경우 처리 )
  • stack을 사용 안 하고 풀이하는 방법도 체크해 보기

 

 


 

 

3. 정답 코드 확인 및 활용 메소드 체크

 

3-1 : 정답 코드 확인

import java.util.*;
class Solution {
    boolean solution(String s) {
    
        boolean answer = true;
        Stack<Character> bracket = new Stack<>();
	    
	    
	    for (int i = 0; i < s.length(); i++) {
			
	    	if(s.charAt(i) == '(') { //여는 괄호면 stack에 넣어주기
	    		bracket.push(s.charAt(i));
	    	}else if(s.charAt(i)==')' && bracket.isEmpty()) { //닫는 괄호면 여는 괄호가 있는지 체크 없다면 비정상적 시작이므로 break;
	    		bracket.push(s.charAt(i));
	    		break;
	    	}else {
	    		bracket.pop(); //여는 괄호가 있는 상태에서 닫는 괄호를 만났으니 여는 괄호 stack에서 빼주기
	    	}
	    	
		}
	    
        //삼항식을 사용하기 위해 위의 if문에서 스택에 닫느 괄호를 넣어주었다.
	    answer = bracket.isEmpty() ? true : false;

        return answer;
    }
}

 

 


 

 

3-2 : 활용 메소드 체크 ( stack method check )

  • peek() : 스택의 가장 위에 있는 데이터 반환
  • push() : 스택의 가장 위에 있는 데이터(peek()) 위에 메모리 생성 및 데이터 추가
  • pop() : 스택의 가장 위에 있는 데이터 삭제 및 반환
  • isEmpty() : 스택이 비어있으면 true, 비어있지 않으면 false 반환
  • clear() : 모든 데이터를 삭제하고 스택 초기화
  • toString() : 모든 데이터를 출력

 

 


 

 

4. 공부하고 싶은 다른 분의 풀이

  • 처음에 괄호 수를 카운트로 체크해서 해결해 볼까 했었는데 그렇게 푸신 분이 계셨다.
  • 그냥 if문을 따로따로 해서 조건 체크 해주면 되는 것을 if else if else를 고집했다니... 이렇게 또 깨달아 간다.

 

class Solution {
    boolean solution(String s) {
        boolean answer = false;
        int count = 0;
        for(int i = 0; i<s.length();i++){
            if(s.charAt(i) == '('){
                count++;
            }
            if(s.charAt(i) == ')'){
                count--;
            }
            if(count < 0){
                break;
            }
        }
        if(count == 0){
            answer = true;
        }

        return answer;
    }
}