-
[알고리즘] 백준 - 균형 잡힌 세상(스택)Algorithm 2024. 4. 18. 16:51
세계는 균형이 잘 잡혀있어야 한다. 양과 음, 빛과 어둠 그리고 왼쪽 괄호와 오른쪽 괄호처럼 말이다.
정민이의 임무는 어떤 문자열이 주어졌을 때, 괄호들의 균형이 잘 맞춰져 있는지 판단하는 프로그램을 짜는 것이다.
문자열에 포함되는 괄호는 소괄호("()") 와 대괄호("[]")로 2종류이고, 문자열이 균형을 이루는 조건은 아래와 같다.
1. 모든 왼쪽 소괄호("(")는 오른쪽 소괄호(")")와만 짝을 이뤄야 한다.
2. 모든 왼쪽 대괄호("[")는 오른쪽 대괄호("]")와만 짝을 이뤄야 한다.
3. 모든 오른쪽 괄호들은 자신과 짝을 이룰 수 있는 왼쪽 괄호가 존재한다.
4. 모든 괄호들의 짝은 1:1 매칭만 가능하다. 즉, 괄호 하나가 둘 이상의 괄호와 짝지어지지 않는다.
5. 짝을 이루는 두 괄호가 있을 때, 그 사이에 있는 문자열도 균형이 잡혀야 한다.
예시
각 문자열은 마지막 글자를 제외하고 영문 알파벳, 공백, 소괄호("( )"), 대괄호("[ ]")로 이루어져 있으며, 온점(".")으로 끝나고, 길이는 100글자보다 작거나 같다. 입력의 종료조건으로 맨 마지막에 온점 하나(".")가 들어온다. 각 줄마다 해당 문자열이 균형을 이루고 있으면 "yes"를, 아니면 "no"를 출력한다.
// 예시 입력 So when I die (the [first] I will see in (heaven) is a score list). [ first in ] ( first out ). Half Moon tonight (At least it is better than no Moon at all]. A rope may form )( a trail in a maze. Help( I[m being held prisoner in a fortune cookie factory)]. ([ (([( [ ] ) ( ) (( ))] )) ]). . . // 예시 출력 yes yes no no no yes yes
풀이import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Stack; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); HashMap<Character, Character> bracketMap = new HashMap<>(); bracketMap.put(')', '('); bracketMap.put(']', '['); while (true) { String line = br.readLine(); // . 하나만 입력시 입력 종료 if (line.equals(".")) break; // 라인의 마지막에는 .으로 끝남 if (line.length() > 1 && line.endsWith(".")) { line = line.substring(0, line.length() - 1); System.out.println(solution(line, bracketMap) ? "yes" : "no"); } } } public static boolean solution(String line, HashMap<Character, Character> bracketMap) { // 왼쪽 브라켓 넣는 스택 Stack<Character> leftBracketStack = new Stack<>(); for (char c : line.toCharArray()) { if (bracketMap.containsValue(c)) { // 열린 괄호인 경우 stack.push(c); } else if (bracketMap.containsKey(c)) { // 닫힌 괄호인 경우 if (stack.isEmpty() || stack.pop() != bracketMap.get(c)) { return false; // 괄호의 짝이 맞지 않음 } } } // 남은 스택이 없으면 모든 브라켓을 사용한 경우기 때문에 통과 return leftBracketStack.isEmpty(); } }
입력부분은 종료한다는데 .을 찍어서 종료한다는 의미를 못알아들어서 GPT를 좀 사용했다.
코딩테스트 합격자 되기 자바편에 144페이지와 유사한 스택 문제이다.
'Algorithm' 카테고리의 다른 글
[알고리즘] 프로그래머스 3단계 - 다단계 칫솔판매 (0) 2024.04.23 [알고리즘] 백준 - 명령프롬프트(문자열) (0) 2024.04.22 [알고리즘] 백준 - 좌표 정렬하기 (0) 2024.04.17 [묘공단] 코딩 테스트 합격자 되기 - 스택, 큐 (0) 2024.04.17