문제
https://www.acmicpc.net/problem/4227
풀이
1. Node.js(fs)
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
function evaluateSmeech(expr) {
if (!isNaN(expr)) {
return parseFloat(expr);
}
expr = expr.slice(1, -1); // 바깥쪽 괄호 제거
let p = parseFloat(expr);
let rest = expr.slice(expr.indexOf(' ') + 1);
let openBrackets = 0;
let splitIndex = -1;
for (let i = 0; i < rest.length; i++) {
if (rest[i] === '(') openBrackets++;
if (rest[i] === ')') openBrackets--;
if (openBrackets === 0 && rest[i] === ' ') {
splitIndex = i;
break;
}
}
let e1 = evaluateSmeech(rest.slice(0, splitIndex));
let e2 = evaluateSmeech(rest.slice(splitIndex + 1));
return p * (e1 + e2) + (1 - p) * (e1 - e2);
}
let results = [];
for (let expr of input) {
if (expr === '()') break;
results.push(evaluateSmeech(expr).toFixed(2));
}
console.log(results.join('\n'));
2. Node.js(readLine)
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
function evaluateSmeech(expr) {
if (!isNaN(expr)) {
return parseFloat(expr);
}
expr = expr.slice(1, -1); // 바깥쪽 괄호 제거
let p = parseFloat(expr);
let rest = expr.slice(expr.indexOf(' ') + 1);
let openBrackets = 0;
let splitIndex = -1;
for (let i = 0; i < rest.length; i++) {
if (rest[i] === '(') openBrackets++;
if (rest[i] === ')') openBrackets--;
if (openBrackets === 0 && rest[i] === ' ') {
splitIndex = i;
break;
}
}
let e1 = evaluateSmeech(rest.slice(0, splitIndex));
let e2 = evaluateSmeech(rest.slice(splitIndex + 1));
return p * (e1 + e2) + (1 - p) * (e1 - e2);
}
let results = [];
rl.on('line', (line) => {
if (line === '()') {
console.log(results.join('\n'));
rl.close();
} else {
results.push(evaluateSmeech(line).toFixed(2));
}
});
3. C#
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<string> results = new List<string>();
string line;
while ((line = Console.ReadLine()) != "()")
{
double result = EvaluateSmeech(line);
results.Add(result.ToString("F2"));
}
Console.WriteLine(string.Join("\n", results));
}
static double EvaluateSmeech(string expr)
{
if (double.TryParse(expr, out double num))
{
return num;
}
expr = expr.Substring(1, expr.Length - 2); // 바깥쪽 괄호 제거
int spaceIndex = expr.IndexOf(' ');
double p = double.Parse(expr.Substring(0, spaceIndex));
string rest = expr.Substring(spaceIndex + 1);
int openBrackets = 0;
int splitIndex = -1;
for (int i = 0; i < rest.Length; i++)
{
if (rest[i] == '(') openBrackets++;
if (rest[i] == ')') openBrackets--;
if (openBrackets == 0 && rest[i] == ' ')
{
splitIndex = i;
break;
}
}
double e1 = EvaluateSmeech(rest.Substring(0, splitIndex));
double e2 = EvaluateSmeech(rest.Substring(splitIndex + 1));
return p * (e1 + e2) + (1 - p) * (e1 - e2);
}
}
설명:
- 입력 처리:
- 이전과 동일하게 처리합니다.
- Smeech 표현식 평가 함수 (evaluateSmeech 또는 EvaluateSmeech):
- 숫자인 경우 해당 숫자를 반환합니다.
- 표현식인 경우:
- 바깥쪽 괄호를 제거합니다.
- 첫 번째 공백을 찾아 확률 p를 추출합니다.
- 남은 부분에서 중첩된 괄호를 고려하여 e1과 e2를 정확히 분리합니다.
- e1과 e2를 재귀적으로 평가합니다.
- p * (e1 + e2) + (1 - p) * (e1 - e2) 공식으로 결과를 계산합니다.
- 결과 계산:
- 각 표현식에 대해 evaluateSmeech 함수를 호출하고 결과를 소수점 둘째 자리까지 반올림합니다.
- 결과 출력:
- 모든 결과를 한 줄에 하나씩 출력합니다.
문제
https://www.acmicpc.net/problem/4227
풀이
1. Node.js(fs)
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
function evaluateSmeech(expr) {
if (!isNaN(expr)) {
return parseFloat(expr);
}
expr = expr.slice(1, -1); // 바깥쪽 괄호 제거
let p = parseFloat(expr);
let rest = expr.slice(expr.indexOf(' ') + 1);
let openBrackets = 0;
let splitIndex = -1;
for (let i = 0; i < rest.length; i++) {
if (rest[i] === '(') openBrackets++;
if (rest[i] === ')') openBrackets--;
if (openBrackets === 0 && rest[i] === ' ') {
splitIndex = i;
break;
}
}
let e1 = evaluateSmeech(rest.slice(0, splitIndex));
let e2 = evaluateSmeech(rest.slice(splitIndex + 1));
return p * (e1 + e2) + (1 - p) * (e1 - e2);
}
let results = [];
for (let expr of input) {
if (expr === '()') break;
results.push(evaluateSmeech(expr).toFixed(2));
}
console.log(results.join('\n'));
2. Node.js(readLine)
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
function evaluateSmeech(expr) {
if (!isNaN(expr)) {
return parseFloat(expr);
}
expr = expr.slice(1, -1); // 바깥쪽 괄호 제거
let p = parseFloat(expr);
let rest = expr.slice(expr.indexOf(' ') + 1);
let openBrackets = 0;
let splitIndex = -1;
for (let i = 0; i < rest.length; i++) {
if (rest[i] === '(') openBrackets++;
if (rest[i] === ')') openBrackets--;
if (openBrackets === 0 && rest[i] === ' ') {
splitIndex = i;
break;
}
}
let e1 = evaluateSmeech(rest.slice(0, splitIndex));
let e2 = evaluateSmeech(rest.slice(splitIndex + 1));
return p * (e1 + e2) + (1 - p) * (e1 - e2);
}
let results = [];
rl.on('line', (line) => {
if (line === '()') {
console.log(results.join('\n'));
rl.close();
} else {
results.push(evaluateSmeech(line).toFixed(2));
}
});
3. C#
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<string> results = new List<string>();
string line;
while ((line = Console.ReadLine()) != "()")
{
double result = EvaluateSmeech(line);
results.Add(result.ToString("F2"));
}
Console.WriteLine(string.Join("\n", results));
}
static double EvaluateSmeech(string expr)
{
if (double.TryParse(expr, out double num))
{
return num;
}
expr = expr.Substring(1, expr.Length - 2); // 바깥쪽 괄호 제거
int spaceIndex = expr.IndexOf(' ');
double p = double.Parse(expr.Substring(0, spaceIndex));
string rest = expr.Substring(spaceIndex + 1);
int openBrackets = 0;
int splitIndex = -1;
for (int i = 0; i < rest.Length; i++)
{
if (rest[i] == '(') openBrackets++;
if (rest[i] == ')') openBrackets--;
if (openBrackets == 0 && rest[i] == ' ')
{
splitIndex = i;
break;
}
}
double e1 = EvaluateSmeech(rest.Substring(0, splitIndex));
double e2 = EvaluateSmeech(rest.Substring(splitIndex + 1));
return p * (e1 + e2) + (1 - p) * (e1 - e2);
}
}
설명:
- 입력 처리:
- 이전과 동일하게 처리합니다.
- Smeech 표현식 평가 함수 (evaluateSmeech 또는 EvaluateSmeech):
- 숫자인 경우 해당 숫자를 반환합니다.
- 표현식인 경우:
- 바깥쪽 괄호를 제거합니다.
- 첫 번째 공백을 찾아 확률 p를 추출합니다.
- 남은 부분에서 중첩된 괄호를 고려하여 e1과 e2를 정확히 분리합니다.
- e1과 e2를 재귀적으로 평가합니다.
- p * (e1 + e2) + (1 - p) * (e1 - e2) 공식으로 결과를 계산합니다.
- 결과 계산:
- 각 표현식에 대해 evaluateSmeech 함수를 호출하고 결과를 소수점 둘째 자리까지 반올림합니다.
- 결과 출력:
- 모든 결과를 한 줄에 하나씩 출력합니다.