728x90
[백준(Baekjoon)] 2257. 화학식량
[입력]
첫째 줄에 화학식이 주어진다. 화학식은 H, C, O, (, ), 2, 3, 4, 5, 6, 7, 8, 9만으로 이루어진 문자열이며, 그 길이는 100을 넘지 않는다.
[출력]
첫째 줄에 화학식량을 출력한다. 분자량이 10,000이 넘는 고분자는 입력으로 주어지지 않는다.
[풀이]
각 화학식을
H -> 1
C -> 12
O -> 16
으로 변환해주어 계산해주는 문제이다.
위 문자와 숫자를 HashMap을 사용하여 저장해주었다.
스택을 이용하면 쉽게 풀 수 있다.
(H)2(O)는 괄호 안에 화학식을 다 더하고 그걸 스택에 넣고 숫자일 경우 pop하여 곱해준다.
그리고 괄호뒤에 숫자가 없으면 1이므로 아무작업도 하지 않는다.
스택에 있는 모든 숫자를 더해주면 화학식량이 구해진다.
[코드]
public class bj2257 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
HashMap<Character, Integer> map = new HashMap<>();
map.put('C', 12);
map.put('H', 1);
map.put('O', 16);
Stack<Integer> s = new Stack<>();
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
//닫는 괄호일때는 여는 괄호까지 다 더해주고 새로 push
if(ch == ')') {
int numR = 0;
while(true) {
if(s.peek() == -1) {
s.pop();
s.push(numR);
break;
}
numR += s.pop();
}
//문자일때는 알맞은 숫자 push
}else if(ch == 'C' || ch == 'H' || ch == 'O') {
s.push(map.get(ch));
//숫자일때는 앞자리 꺼내서 곱하고 push
}else if(ch >= '0' && ch <= '9') {
int calc = s.pop() * (ch - '0');
s.push(calc);
//여는 괄호는 -1로 표시해서 push
}else {
s.push(-1);
}
}
int result = 0;
while(!s.isEmpty()) {
result += s.pop(); //스택에 남은거 다 더하기
}
System.out.println(result);
}
}
'programming > 알고리즘 풀이' 카테고리의 다른 글
[백준(Baekjoon)] 14235. 크리스마스 선물 (0) | 2021.08.27 |
---|---|
[백준(Baekjoon)] 1260. DFS와 BFS (0) | 2021.08.26 |
[백준(Baekjoon)] 1759. 암호 만들기 (0) | 2021.08.24 |
[백준(Baekjoon)] 17086. 아기 상어 2 (0) | 2021.08.24 |
[백준(Baekjoon)] 2407. 조합 (0) | 2021.08.16 |
댓글