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