본문 바로가기
PS 문제 풀이/HackerRank

[HackerRank] Java Stack

by 까망 하르방 2021. 2. 18.
반응형

출처: www.hackerrank.com/challenges/java-stack/problem?h_r=next-challenge&h_v=zen&h_r=next-challenge&h_v=zen 

 

stack의 LIFO(Last In First Out) 특성을 이용해서 

괄호쌍이 일치 여부를 판단하여 [true]/[false] 출력

: 열린 괄호 '[', '{',  '(' 와 닫힌 괄호 ']', '}', ')' 가 적절한 위치에 있는지 확인


import java.util.*;
 
class Solution{
     
    public static void main(String []argh)
    {
        Scanner sc = new Scanner(System.in);
         
        while (sc.hasNext()) {
             
            String str = sc.next();
            Stack<String> stack = new Stack<>();
            boolean answer = true;
            // 끝에서 부터 괄호를 탐색하겠다.
            int idx = str.length() - 1;
            while(idx >= 0){
                String target = str.substring(idx,  idx+1);
                 
                // 닫힌 괄호 형태는 우선 스택에 넣어준다.
                if(target.equals(")") ||  target.equals("}") || target.equals("]")) {
                     
                    stack.push(target);
                }else { // 여는 괄호가 나올 시 스택에서  pop하여 쌍이 맞는지 확읺나다.
                    // 우선 스택이 비어져 있는지 확인한다.
                    if(stack.isEmpty()) {
                        answer = false;
                        stack.empty();
                        break;
                    }else {
                        String partner = stack.pop();
                        if(target.equals("[")) {
                            if(!partner.equals("]")) {
                                // 쌍이 맞지 않으면
                                // 스택을 리셋한다.
                                answer = false;
                                stack.empty();
                                break;
                            }
                        }else if(target.equals("{")) {
                            if(!partner.equals("}")) {
                                answer = false;
                                stack.empty();
                                break;
                            }
                        }else if(target.equals("(")){
                            if(!partner.equals(")")) {
                                answer = false;
                                stack.empty();
                                break;
                            }
                        }
                    }
                }
                idx--;
            }
             
            // 여는 괄호 없이 닫는 괄호만 있을 수 있다.
            // 탐색이 끝났을 때 스택에 남아 있는 원소 확인
            if(!stack.isEmpty()) {
                answer = false;
                // 다음 탐색을 위해 비워준다.
                stack.empty();
            }
             
            if(answer){
                System.out.println("true");
            }else{
                System.out.println("false");
            }
        }
         
    }
}

 

반응형

'PS 문제 풀이 > HackerRank' 카테고리의 다른 글

[HackerRank] Apple and Orange  (0) 2021.02.18
[HackerRank] Matrix Layer Rotation  (0) 2021.02.18
[HackerRank] Queen's Attack II  (2) 2021.02.18
[HackerRank] The Bomberman Game  (0) 2021.02.18
[HackerRank] Strange Counter  (0) 2021.02.18

댓글