[Silver II] 화학식량 - 2257
성능 요약
메모리: 69104 KB, 시간: 8 ms
분류
자료 구조, 스택, 문자열
제출 일자
2023년 12월 25일 23:17:40
문제 설명
우리가 널리 사용하는 H2O(물), CH3COOH(아세트산)과 같은 화학식은 알파벳과 숫자, 그리고 괄호로 구성된다. 먼저 알파벳은 원자를 나타내는 것으로 H는 수소(Hydrogen), C는 탄소(Carbon), O는 산소(Oxygen) 원자를 뜻한다. 또한 원자를 나타내는 알파벳 뒤에 따르는 숫자는 그 원자가 몇 개 포함되어 있는지를 뜻한다. 따라서 COOHHH 분자는 CO2H3로 나타낼 수 있다. 이 문제에서, 숫자는 항상 2 이상 9 이하로만 입력으로 주어진다. 따라서 CO23과 같이 숫자가 두자리인 경우는 없다.
물의 화학식을 보고 물은 두 개의 수소 원자와 한 개의 산소 원자로 이루어졌음을 알 수 있다. 또한 아세트산의 화학식처럼 한 종류의 알파벳이 화학식에 여러 번 나타날 수도 있다. 실제 화학식 또한 이렇게 사용되는데, 이는 분자의 결합 구조를 나타내기 위함이다.
종종 화학식에는 괄호가 사용되기도 하는데 괄호로 묶인 원자들은 하나의 새로운 원자와 같은 작용을 한다. 따라서 CH(CO2H)(CO2H)(CO2H) 분자는 CH(CO2H)3와 같이 나타낼 수 있다. 괄호 안에 아무런 알파벳도 없는 경우도 있을 수 있는데, 이런 경우는 괄호가 없는 경우와 마찬가지라고 생각하면 된다.
이러한 화학식을 보고 우리는 화학식량을 계산할 수 있는데, 화학식량이란 그 화학식에 포함되어 있는 모든 원자들의 질량의 합을 말한다. 수소 원자 하나의 질량은 1, 탄소 원자 하나의 질량은 12, 산소 원자 하나의 질량은 16이다. 물은 두 개의 수소 원자와 한 개의 산소 원자로 이루어져 있으므로 물의 화학식량은 18이다.
화학식이 주어졌을 때, 이 화학식의 화학식량을 계산하는 프로그램을 작성하시오. 화학식은 수소, 탄소, 산소만을 포함하고 있는 것만이 입력으로 주어진다.
입력
첫째 줄에 화학식이 주어진다. 화학식은 H, C, O, (, ), 2, 3, 4, 5, 6, 7, 8, 9만으로 이루어진 문자열이며, 그 길이는 100을 넘지 않는다.
출력
첫째 줄에 화학식량을 출력한다. 분자량이 10,000이 넘는 고분자는 입력으로 주어지지 않는다.
풀이
위 문제는 스택 문제로, 괄호 세트( )마다 값을 계산해서 스택에 저장하는 방식으로 문제를 풀었습니다.
만약 화학식이 나온다면 이를 질량으로 변환하여 스택에 저장해주고, 숫자가 나온다면 스택의 마지막 값에 해당 숫자를 곱해주었습니다.
괄호에 대한 처리에서 고민을 했었는데, 만약 )가 나온다면 (가 나올 때까지의 숫자를 스택에서 빼고 해당 숫자들을 더한 다음에 결과값을 스택에 다시 넣어주는 방식으로 해결하였습니다.
그림으로 설명하면 다음과 같습니다.

다음은 코드입니다.
let input = readLine()!
let chem = ["H": 1, "C": 12, "O": 16]
var stack = [String]()
for i in input {
if i == "(" {
stack.append(String(i))
} else if i == ")" {
var count = 0
while true {
let lastStr = stack.last!
stack.removeLast()
if lastStr == "(" {
break
}
count += Int(lastStr)!
}
stack.append(String(count))
} else if i == "H" || i == "C" || i == "O" {
stack.append(String(chem[String(i)]!))
} else { // 숫자
let lastNum = Int(stack.last!)! * Int(String(i))!
stack.removeLast()
stack.append(String(lastNum))
}
}
var ans = 0
for sta in stack {
ans += Int(sta)!
}
print(ans)
'PS > BOJ' 카테고리의 다른 글
[백준(BOJ)] 10845 큐 - 스위프트 (Swift) (0) | 2024.01.02 |
---|---|
[백준(BOJ)] 2304 창고 다각형 - 스위프트 (Swift) (0) | 2023.12.29 |
[백준(BOJ)] 15815 천재 수학자 성필 - 스위프트 (Swift) (2) | 2023.12.28 |
[백준(BOJ)] 2841 외계인의 기타 연주 - 스위프트 (Swift) (2) | 2023.12.28 |
[백준(BOJ)] 9935 문자열 폭발 - 스위프트(Swift) (0) | 2023.12.28 |
[Silver II] 화학식량 - 2257
성능 요약
메모리: 69104 KB, 시간: 8 ms
분류
자료 구조, 스택, 문자열
제출 일자
2023년 12월 25일 23:17:40
문제 설명
우리가 널리 사용하는 H2O(물), CH3COOH(아세트산)과 같은 화학식은 알파벳과 숫자, 그리고 괄호로 구성된다. 먼저 알파벳은 원자를 나타내는 것으로 H는 수소(Hydrogen), C는 탄소(Carbon), O는 산소(Oxygen) 원자를 뜻한다. 또한 원자를 나타내는 알파벳 뒤에 따르는 숫자는 그 원자가 몇 개 포함되어 있는지를 뜻한다. 따라서 COOHHH 분자는 CO2H3로 나타낼 수 있다. 이 문제에서, 숫자는 항상 2 이상 9 이하로만 입력으로 주어진다. 따라서 CO23과 같이 숫자가 두자리인 경우는 없다.
물의 화학식을 보고 물은 두 개의 수소 원자와 한 개의 산소 원자로 이루어졌음을 알 수 있다. 또한 아세트산의 화학식처럼 한 종류의 알파벳이 화학식에 여러 번 나타날 수도 있다. 실제 화학식 또한 이렇게 사용되는데, 이는 분자의 결합 구조를 나타내기 위함이다.
종종 화학식에는 괄호가 사용되기도 하는데 괄호로 묶인 원자들은 하나의 새로운 원자와 같은 작용을 한다. 따라서 CH(CO2H)(CO2H)(CO2H) 분자는 CH(CO2H)3와 같이 나타낼 수 있다. 괄호 안에 아무런 알파벳도 없는 경우도 있을 수 있는데, 이런 경우는 괄호가 없는 경우와 마찬가지라고 생각하면 된다.
이러한 화학식을 보고 우리는 화학식량을 계산할 수 있는데, 화학식량이란 그 화학식에 포함되어 있는 모든 원자들의 질량의 합을 말한다. 수소 원자 하나의 질량은 1, 탄소 원자 하나의 질량은 12, 산소 원자 하나의 질량은 16이다. 물은 두 개의 수소 원자와 한 개의 산소 원자로 이루어져 있으므로 물의 화학식량은 18이다.
화학식이 주어졌을 때, 이 화학식의 화학식량을 계산하는 프로그램을 작성하시오. 화학식은 수소, 탄소, 산소만을 포함하고 있는 것만이 입력으로 주어진다.
입력
첫째 줄에 화학식이 주어진다. 화학식은 H, C, O, (, ), 2, 3, 4, 5, 6, 7, 8, 9만으로 이루어진 문자열이며, 그 길이는 100을 넘지 않는다.
출력
첫째 줄에 화학식량을 출력한다. 분자량이 10,000이 넘는 고분자는 입력으로 주어지지 않는다.
풀이
위 문제는 스택 문제로, 괄호 세트( )마다 값을 계산해서 스택에 저장하는 방식으로 문제를 풀었습니다.
만약 화학식이 나온다면 이를 질량으로 변환하여 스택에 저장해주고, 숫자가 나온다면 스택의 마지막 값에 해당 숫자를 곱해주었습니다.
괄호에 대한 처리에서 고민을 했었는데, 만약 )가 나온다면 (가 나올 때까지의 숫자를 스택에서 빼고 해당 숫자들을 더한 다음에 결과값을 스택에 다시 넣어주는 방식으로 해결하였습니다.
그림으로 설명하면 다음과 같습니다.

다음은 코드입니다.
let input = readLine()!
let chem = ["H": 1, "C": 12, "O": 16]
var stack = [String]()
for i in input {
if i == "(" {
stack.append(String(i))
} else if i == ")" {
var count = 0
while true {
let lastStr = stack.last!
stack.removeLast()
if lastStr == "(" {
break
}
count += Int(lastStr)!
}
stack.append(String(count))
} else if i == "H" || i == "C" || i == "O" {
stack.append(String(chem[String(i)]!))
} else { // 숫자
let lastNum = Int(stack.last!)! * Int(String(i))!
stack.removeLast()
stack.append(String(lastNum))
}
}
var ans = 0
for sta in stack {
ans += Int(sta)!
}
print(ans)
'PS > BOJ' 카테고리의 다른 글
[백준(BOJ)] 10845 큐 - 스위프트 (Swift) (0) | 2024.01.02 |
---|---|
[백준(BOJ)] 2304 창고 다각형 - 스위프트 (Swift) (0) | 2023.12.29 |
[백준(BOJ)] 15815 천재 수학자 성필 - 스위프트 (Swift) (2) | 2023.12.28 |
[백준(BOJ)] 2841 외계인의 기타 연주 - 스위프트 (Swift) (2) | 2023.12.28 |
[백준(BOJ)] 9935 문자열 폭발 - 스위프트(Swift) (0) | 2023.12.28 |