-
[백준/BOJ] 4949번 : 균형잡힌 세상 (JAVA / 자바)백준 2022. 3. 1. 18:45
안녕하세요~ 코딩하는 코알못 코메인입니다.
https://www.acmicpc.net/problem/4949
- 문제 -
난이도 브론즈 3 문제이다.
자바에서 입력방식은 scanner와 bufferedreader가 있다.
자바를 초반에 접하면 처음에 배우는 입력은 scanner이다. scanner가 bufferedreader보다 편하지만 속도가 느리다.
bufferedreader는 무조건 문자열로 받아오기때문에 정수형이나 실수형 변수에 저장하기 위해서는 입력과 형변환을 해줘야한다.
더 자세한 내용은 아래 글 참고 하면 좋다.
풀이 방법
처음에 풀때 괄호를 전부 문자열에 저장해서 이걸 어떻게든 비교해서 뽑아보려 했지만 [(])이런 괄호 상태에 막혀 포기했다. 그리고 그때서야 본 알고리즘 분류... 스택이 쓰여있다... 스택을 생각하며 문제 풀이를 노트에 끄적여봤다... 풀어졌다... 항상 알고리즘 분류를 확인하자...
풀이는 간단하다.
여는 괄호 ("(", "[")가 오면 스택에 저장한다.
닫는 괄호 (")", "]")가 오면 스택에 마지막에 저장된 괄호가 자신과 동일한 여는 괄호인지 확인한다. 소괄호면 소괄호, 대괄호면 대괄호.
하지만 비교하기전에 스택이 비어있는지 부터 확인하지 않으면 에러가 나오기 때문에 우선적으로 비어있는지를 확인한다. 비어있는데 닫는 괄호가 온다면 그건 옳지 않는 괄호 형태이기 때문에 닫는 괄호를 저장하고, 반복문을 종료한다.(저장하는 이유는 마지막에 스택에 저장된 값의 여부에 따라 출력값을 정해줄 것이기 때문에)
스택이 비어있지 않다면 마지막 값이 같은 부류의 여는 괄호인지 확인한다. 맞다면 여는 괄호를 제거해준다.
다른 부류의 여는 괄호라면 반복문을 그대로 종료한다.(스택에 괄호가 저장된 상태로 종료되는 것이다.)
강제로 종료되는것이 아니라면 문자열의 길이만큼 반복하고, 종료되었을때 정상적이라면 스택은 비어있을 것이다.
이제 출력값을 정해준다. 스택이 비어있다면 yes. 비어있지 않다면 no를 출력한다.
코드를 보자.
-풀이-
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Stack; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuilder sb = new StringBuilder(); //무한루프 while(true) { String input = br.readLine(); //문자열의 자릿수를 비교할땐 char형으로 확인하기때문에 스택을 Character로 선언해준다. Stack<Character> stack = new Stack<Character>(); //.이 입력되면 무한루프 종료 if(input.equals(".")) break; for(int i = 0; i < input.length(); i++) { char ch = input.charAt(i); //여는 괄호면 스택에 저장 if(ch == '(' || ch == '[') stack.push(ch); //닫는 괄호일때 각 조건을 걸어준다. if(ch == ')') { if(stack.empty()) { stack.push(ch); break; } if(stack.peek() == '(') stack.pop(); else break; }else if(ch == ']') { if(stack.empty()) { stack.push(ch); break; } if(stack.peek() == '[') stack.pop(); else break; } } //스택이 비어있는지에대한 여부에 따른 다른 출력값을 sb에 저장 if(stack.isEmpty()) sb.append("yes").append("\n"); else sb.append("no").append("\n"); } System.out.println(sb); } }
-결과-
아직 코딩 공부가 부족한 필자라 설명과 풀이 방법이 많이 미흡할 수 있다. 코딩 고수분들은 보시고 문제점이 있다면 댓글로 말해주시면 감사한 마음으로 참고 수정 하겠습니다.
'백준' 카테고리의 다른 글
[백준/BOJ] 9012번 : 괄호 (JAVA / 자바) (0) 2022.03.01 [백준/BOJ] 7568번 : 덩치 (JAVA / 자바) (0) 2022.03.01 [백준/BOJ] 2869번 : 달팽이는 올라가고 싶다 (JAVA / 자바) (0) 2022.03.01 [백준/BOJ] 2839번 : 설탕 배달 (JAVA / 자바) (0) 2022.03.01 [백준/BOJ] 2805번 : 나무 자르기 (JAVA / 자바) (0) 2022.03.01