[Programmers] 올바른 괄호 - Java

개발자가 되고 싶어요·2023년 4월 20일
0

Algorithm

목록 보기
3/3
post-thumbnail
import java.util.*;

class Solution {
    boolean solution(String s) {
        boolean answer = false;
        int left = 0;
        int right = 0;
        
        String str = s;
        String[] arr = str.split("");
        
        
        for (int i = 0;  i < arr.length; i++) {
            if (arr[i].equals("(")) {
                left += 1;
            } else {
                right += 1;
            }
                    
            if (left < right) {
                return false;
            }
        }
        if (left == right) {
            answer = true;
        }
        return answer;
    }
}

우선 문자열을 잘라서 배열에 넣는 split() 메소드를 사용하여 반복문을 돌리는 방식으로 하였는데

이 방법을 사용하니까 시간 초과로 실패하게 된다.

그래서 찾아보니 문자열을 한 글자 씩 비교하게 해주는 메소드인 charAt()이 있었고 charAt으로 비교할 경우 split() 으로 배열을 만들어 비교하는 것 보다 속도, 성능이 더 좋다는 것을 알게 되었다


Stackoverflow charAt과 split 차이
String's split or charAt


charAt() 사용한 코드

import java.util.*;

class Solution {
    boolean solution(String s) {
        boolean answer = false;
        int left = 0;
        int right = 0;

        for (int i = 0;  i < s.length(); i++) {
                if (s.charAt(i) == '(') {
                    left += 1;
                } else {
                    right += 1;
                }
                if (left < right) {
                    return false;
                }
            }
        if (left == right){
            answer = true;
        }
        return answer;
    } 
}

제출하면

정답 처리 된다.

아직은 큐, 스택이 익숙치 않아서 스택으로 푸는 방법도 알아보겠다.

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('(');
            } else {
                if (stack.empty()) {
                     return false;                    
                }
                stack.pop();
            }
        }
        answer = stack.empty();
        return answer;
    }
}

스택으로 푸는 방식은 ( 가 있다면 stack에 (를 추가해주고 (가 오지 않고 )가 먼저 온다면 false를 출력해주는 방식으로 풀면 된다.

나는 배열로 개수를 더해가면서 풀었는데 stack, queue 풀이를 볼 때면 항상 나와는 다른 생각에 놀란다.

profile
I want to be a Backend Developer (run start-up)

0개의 댓글