문제

https://www.acmicpc.net/problem/2504

분석/설계

Stack 자료구조를 활용하여, 문제의 조건들을 구현 가능합니다.

 

1. 입력받은 문자열을 각각의 문자로 쪼개 확인합니다.

2. 문자의 각 괄호가 '(' , '[' 이면 2, 3을 곱해줍니다.

3. 문자의 괄호가 ')'의 경우

    3.1 스택이 비어있거나 '('이 없는 경우 결과 값을 0으로 수정.

    3.2 이전 문자 값이 '('  일 경우 결과 값에 더해주고, Stack에서 제거.

4. 문자의 괄호가 ']' 경우

    4.1 스택이 비어있거나 '['이 없는 경우 결과 값을 0으로 수정.

    4.2 이전 문자 값이 '['  일 경우 결과 값에 더해주고, Stack에서 제거.

 

구현 코드

import java.util.Scanner;
import java.util.Stack;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String str = sc.next();
		Stack<Character> stack = new Stack<>();
		
		int res = 0;
		int val = 1;
		
		for (int i=0; i<str.length(); i++) {
			char c = str.charAt(i);
			if (c == '(' ) {
				stack.push(c);
				val *= 2;
			} else if(c == '[') {
				stack.push(c);
				val *= 3;
			} else if(c == ')') {
				if(stack.isEmpty() || stack.peek() != '(') {
					res = 0;
					break;
				} else if(str.charAt(i-1) == '(') {
					res += val;
				}
				stack.pop();
				val /= 2;
			} else if(c == ']') {
				if(stack.isEmpty() || stack.peek() != '[') {
					res = 0;
					break;
				} else if(str.charAt(i-1) == '[') {
					res += val;
				}
				stack.pop();
				val /= 3;
			}
		}
		
		if(!stack.isEmpty()) {
			res = 0;
		} 
		System.out.println(res);
		sc.close();	
	}
}

정리

조건들을 잘 읽고 어떻게 구현할지 쪼개서 생각해봐야 합니다.

Java에서 Stack과 문자열 다루는 메서드들에 대해서는 익숙해질 필요가 있습니다.

  • push(item): item 하나를 스택의 가장 윗부분에 삽입.
  • peek(): 스택의 가장 위에 있는 항목을 반환.
  • pop(): 스택에서 가장 위에 있는 항목을 삭제하고 해당 item을 반환.
  • isEmpty(): 스택이 비어있는지 유무에 따라 true/false를 반환.

참고

https://www.acmicpc.net/problem/2504

'Algorithm > 구현' 카테고리의 다른 글

[백준] 참외밭  (0) 2022.12.23
[백준] 배열돌리기 1  (0) 2022.12.23
[백준] 마인크래프트  (0) 2022.12.23
구현 - 문자열 재정렬  (0) 2022.03.17

+ Recent posts