백준 2257번 화학식량 Java

: ) YOUNG·2025년 2월 14일
1

알고리즘

목록 보기
453/458
post-thumbnail

백준 2257번 화학식량 Java

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

문제



생각하기


  • 스택, 문자열 문제이다.


동작

이 문제를 풀면서 가장 까다로웠던 점이 숫자였는데,

숫자가 나오는 경우가 문자 중간에 나오거나, 괄호가 끝나는 경우가 있다.

따라서 문자가 ), C, H, O일 때 i를 증가시켜서 다음 문자가 숫자인지 확인하도록 구현했다.





결과


코드


import java.io.*;
import java.util.ArrayDeque;

public class Main {

    // input
    private static BufferedReader br;

    // variables
    private static char[] chArr;

    public static void main(String[] args) throws IOException {
        br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        input();

        bw.write(solve());
        bw.close();
    } // End of main()

    private static String solve() {
        StringBuilder sb = new StringBuilder();

        int N = chArr.length;
        int i = 0;
        ArrayDeque<Integer> que = new ArrayDeque<>();

        while (i < N) {
            char ch = chArr[i];

            if (ch == '(') {
                que.addLast(-1);
                i++;
            } else if (ch == ')') {
                int value = 0;
                while (!que.isEmpty() && que.getLast() != -1) {
                    value += que.removeLast();
                }

                while (!que.isEmpty() && que.getLast() == -1) {
                    que.removeLast();
                }

                i++;
                if (i < N && Character.isDigit(chArr[i])) {
                    value *= Character.getNumericValue(chArr[i]);
                }

                que.addLast(value);
            } else if (ch == 'C' || ch == 'H' || ch == 'O') {
                int value = calc(ch);

                i++;
                if (i < N && Character.isDigit(chArr[i])) {
                    value *= Character.getNumericValue(chArr[i]);
                }
                que.addLast(value);
            } else {
                i++;
            }
        }

        int ans = 0;
        for (int num : que) {
            ans += num;
        }

        sb.append(ans);
        return sb.toString();
    } // End of solve()

    private static int calc(char ch) {
        if (ch == 'C') {
            return 12;
        } else if (ch == 'H') {
            return 1;
        } else {
            return 16;
        }
    } // End of calc()

    private static void input() throws IOException {
        chArr = br.readLine().toCharArray();
    } // End of input()
} // End of Main class

0개의 댓글

관련 채용 정보