[백준] 2257. 화학식량
문제 링크
풀이 과정
스택 문제입니다.
아이디어는 다음과 같습니다.
- 초기에 0을 push하여, 이 값에 계속해서 질량을 누적시킨다.
- 화학식을 순회하며, 해당 위치까지 진행했을 시 스택의 top엔 거기까지 누적된 질량 값을 위치하게 된다.
- 여는 괄호가 등장하면, 스택의 depth가 하나 깊어지도록, 스택에 0이라는 초기값을 넣자. 이후 1번과 같이 이 값에 괄호 내부 질량값을 누적시킨다.
- 닫는 괄호가 등장하면, 현재 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());
}
}
댓글남기기