본문 바로가기
programming/알고리즘 풀이

[백준(Baekjoon)] 2257. 화학식량

by 몽구스_ 2021. 8. 25.
728x90

 

 

[백준(Baekjoon)] 2257. 화학식량

 

 

 

2257번: 화학식량

첫째 줄에 화학식이 주어진다. 화학식은 H, C, O, (, ), 2, 3, 4, 5, 6, 7, 8, 9만으로 이루어진 문자열이며, 그 길이는 100을 넘지 않는다.

www.acmicpc.net

 

 

 

[입력]

 

첫째 줄에 화학식이 주어진다. 화학식은 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);

	}

}

 

 

 

댓글