문제
https://www.acmicpc.net/problem/2257
풀이(18분)
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();
Stack<Integer> stack = new Stack<>();
Map<Character, Integer> atomicWeights = Map.of('H', 1, 'C', 12, 'O', 16);
int totalMass = 0;
for (int i = 0; i < line.length(); i++) {
char c = line.charAt(i);
if (atomicWeights.containsKey(c)) { // 원자라면
stack.push(atomicWeights.get(c));
} else if (c == '(') { // 여는 괄호라면
stack.push(-1); // -1을 여는 괄호의 표시로 사용
} else if (c == ')') { // 닫는 괄호라면
int sum = 0;
while (!stack.isEmpty() && stack.peek() != -1) {
sum += stack.pop();
}
stack.pop(); // 여는 괄호 제거
stack.push(sum); // 괄호 안의 총합을 스택에 저장
} else { // 숫자인 경우 (2~9)
int lastValue = stack.pop();
stack.push(lastValue * (c - '0'));
}
}
while (!stack.isEmpty()) {
totalMass += stack.pop();
}
System.out.println(totalMass);
}
}
문제 풀이 전략
괄호를 사용한다는 부분에서 스택을 이용하는 문제라고 생각했다.
추가적으로, 정해진 화학기호에 대한 원자값을 이용하기 위해 맵을 사용 하였다.
다만, 처음 사용해 보는 문법인 Map.of 메서드를 사용하여 구현해 보았다.
문제 풀이 자체는 간단하다. 입력받은 문장에 대해 문자인지 아닌지를 먼저 구분한다.
문자라면, 괄호에 따라 사용한다. 여는 괄호라면 -1을 통해 표시한다.
닫는 괄호라면 stack에 추가해 줄 값을 저장한다. 최종적으로 여는 괄호를 만나면 스택에 추가한다.
여기서 스택에 추가하는 부분이 중요하다.
문자가 아닌 숫자가 나왔다면, 스택에서 가장 최근 값을 꺼내 곱해준 뒤 다시 넣는다.
-> 이렇게 처리해 주어야 최종적으로 ((CH)2(OH2H)(C(H))O)3 같이 괄호가 끝난 뒤에 곱하기가 나오는 것도 처리가 가능하다.
'문제 풀이 > 백준' 카테고리의 다른 글
[백준] 1456번. 거의 소수(JAVA) (0) | 2025.03.12 |
---|---|
[백준] 2666번. 벽장문의 이동(JAVA) (1) | 2025.03.11 |
[백준] 1099번. 알 수 없는 문장(JAVA) (0) | 2025.03.10 |
[백준] 1431번. 시리얼 번호(JAVA) (1) | 2025.03.06 |
[백준] 4307번. 개미(JAVA) (0) | 2025.03.04 |