코테/프로그래머스

[프로그래머스/Lv. 2] 올바른 괄호

imname1am 2023. 2. 23. 17:00
반응형

내 코드 (1트. 틀림)

import java.util.*;

class Solution {
    boolean solution(String s) {
        boolean answer = true;

        Queue<String> q = new LinkedList();
        for(int i=0 ; i < s.length() ; i++) {
            if(s.substring(i, i+1).equals("(")) {
                q.offer("(");
            } else {
                q.poll();
            }
        }
        
        if(!q.isEmpty()) {
            answer = false;
        }

        return answer;
    }
}

스택 쓰면 될 거 같았는데 일단 큐를 먼저 써보았음...

근데 패스 못 한 TC들이 있었음..

2번,6번 TC를 통과하지 못 한...


내 코드 (2트. 틀림)

import java.util.*;

class Solution {
    boolean solution(String s) {
        boolean answer = true;

        Stack<String> stack = new Stack<String>();
        for(int i=0 ; i < s.length() ; i++) {
            if(s.substring(i, i+1).equals("(")) {
                stack.push("(");
            } else {
                // 스택이 비어있는 경우
                if(stack.empty()) {
                    answer = false;
                    break;
                }
                stack.pop();
            }
        }
        
        if(!stack.empty()) {
            answer = false;
        }

        return answer;
    }
}

그래서 원래 문제 의도인 것 같은 스택을 이용해 풀어보았음..

하지만 이마저도 효율성 테스트 통과를 못 한..😥

 

그래서 뭘까.. 싶어서 힌트를 보기로 했고, 문제를 해결할 수 있었다!


내 코드 (정답)

import java.util.*;

class Solution {
    boolean solution(String s) {
        boolean answer = true;

        Stack<String> stack = new Stack<String>();
        for(int i=0 ; i < s.length() ; i++) {
            if(s.charAt(i) == '(') {
                stack.push("(");
            } else {
                // 스택이 비어있는 경우
                if(stack.empty()) {
                    answer = false;
                    break;
                }
                stack.pop();
            }
        }
        
        if(!stack.empty()) {
            answer = false;
        }

        return answer;
    }
}

알고 보니 내가 반복문 안에서 .substring()을 썼는데,

얘를 .charAt()으로 바꿔주면 된다고 해서 해봤더니 패스했다!!

substring보다 charAt의 효율성이 더 좋은가봉가..🤔


 

프로그래머스

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

programmers.co.kr

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;
    }
}

다른 분들 코드도 봤는데, 아예 스택을 이용하지 않고

변수 count 하나만 사용해서 푼 경우도 많았다.

"(" 면 count++를 하고, ")" 면 count--를 해서

이 count가 0 보다 작으면 반복문을 탈출하게 break하고,

반복문을 나와서도 count가 0이면 true가 나오게 했더랏..

(한 수 배우고 갑니다...)


(참고)

✔ 스택 클래스 사용법

 

[Java] 자바 Stack 클래스 사용법 & 예제 총정리

Stack이란? 자료 구조 중 하나인 Stack의 사전적 정의는 '쌓다', '더미'입니다. 상자에 물건을 쌓아 올리듯이 데이터를 쌓는 자료 구조라고 할 수 있습니다. Stack의 가장 큰 특징은 나중에 들어간 것

coding-factory.tistory.com

✔ 효율성 부분 힌트

 

프로그래머스

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

programmers.co.kr

 

반응형