[백준] 2257. 화학식량

1 분 소요

문제 링크

[백준] 2257. 화학식량


풀이 과정

스택 문제입니다.

아이디어는 다음과 같습니다.

  1. 초기에 0을 push하여, 이 값에 계속해서 질량을 누적시킨다.
  2. 화학식을 순회하며, 해당 위치까지 진행했을 시 스택의 top엔 거기까지 누적된 질량 값을 위치하게 된다.
  3. 여는 괄호가 등장하면, 스택의 depth가 하나 깊어지도록, 스택에 0이라는 초기값을 넣자. 이후 1번과 같이 이 값에 괄호 내부 질량값을 누적시킨다.
  4. 닫는 괄호가 등장하면, 현재 top을 하나 제거한 뒤의 top에 누적시킨다.


위 예시는, 아이디어에 따른 스택의 변화 모습을 보여줍니다.


빨간 네모로 친 부분을 보면, 여는 괄호를 만날 때 새로 0을 push하고 이후에 원자를 만나면 그 값을 누적시키고, 닫는 괄호를 만날 때 그 동안 누적된 부분 질량 값을 원래 값에 누적시키는 모습을 볼 수 있습니다.


코드

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        char[] arr = sc.nextLine().toCharArray();
        Deque<Integer> stack = new ArrayDeque<>();
        int before = 0;
        stack.push(0);

        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == '(') {
                stack.push(0);
            } else if (arr[i] == ')') {
                before = stack.pop();
                stack.push(stack.pop() + before);
            } else if (arr[i] >= '2' && arr[i] <= '9') {
                stack.push(stack.pop() + before * (arr[i] - '0' - 1));
            } else {
                if (arr[i] == 'H') before = 1;
                else if (arr[i] == 'C') before = 12;
                else before = 16;

                stack.push(stack.pop() + before);
            }
        }

        System.out.println(stack.pop());
    }
}

카테고리:

업데이트:

댓글남기기