06. Balanced Brackets
Здравейте банда! Може ли някой да ми помогне да разбера къде греша. Judge ми дава 85/100
6. Balanced Brackets
You will receive n lines. On those lines, you will receive one of the following:
- Opening bracket – “(“,
- Closing bracket – “)” or
- Random string
Your task is to find out if the brackets are balanced. That means after every closing bracket should follow an opening one. Nested parentheses are not valid, and if two consecutive opening brackets exist, the expression should be marked as unbalanced.
Input
- On the first line, you will receive n – the number of lines, which will follow
- On the next n lines, you will receive “(”, “)” or another string
Output
You have to print “BALANCED”, if the parentheses are balanced and “UNBALANCED” otherwise.
Constraints
- n will be in the interval [1…20]
- The length of the stings will be between [1…100] characters
Examples
Input |
Output |
|
Input |
Output |
8 ( 5 + 10 ) * 2 + ( 5 ) -12 |
BALANCED |
|
6 12 * ) 10 + 2 - ( 5 + 10 )
|
UNBALANCED |
За неточната формулировка си абсолютно прав, благодарско от мен!
Здравейте, имам същата задача във Fundamental модула и Judge ми дава 85/100. Може ли да ми помогнете да открия къде греша в кода си? Затруднявам се да добавя проверката за две последователни еднакви скоби и може би тук е проблема.
using System;
namespace TrainingWithData2
{
class MainClass
{
public static void Main()
{
int rangeofLines = int.Parse(Console.ReadLine());
int countOpenBracket = 0;
int countClosedBracket = 0;
string line = Console.ReadLine();
if(line==")")
{
Console.WriteLine("UNBALANCED");
}
else {
for (int i = 0; i < rangeofLines - 1; i++)
{
if (line == "(")
{
countOpenBracket++;
}
else if (line == ")")
{
countClosedBracket++;
}
line = Console.ReadLine();
}
}
if (countOpenBracket == countClosedBracket)
{
Console.WriteLine("BALANCED");
}
else
{
Console.WriteLine("UNBALANCED");
}
}
}
}
На български съм направил коментари в кода Ви.
Опитал съм се да се впиша във вашата логика… май кода трудно си личи какъв е бил в началото :)
По принцип логиката може доста да се оптимизира…
Ползвал съм return-и, което не го намирам за много коректно, но иначе трябва да се пренашише целия код за да се избегне ползването им.
using System;
namespace TrainingWithData2
{
class MainClass
{
public static void Main()
{
int rangeofLines = int.Parse(Console.ReadLine());
int countOpenBracket = 0;
int countClosedBracket = 0;
// кода по-долу търси да "хване" първа затваряща скоба...
// но той ще изследва за първа затвяряща скоба САМО за първия подаден символ
// затова по-добре да го няма
//string line = Console.ReadLine();
//if (line == ")")
//{
// Console.WriteLine("UNBALANCED");
//}
//else
//{
// ще използваме една променлива в която да съхраняваме всяка предходна скоба и да я сравняваме.
// като за начало ще сложим ")" скоба - така, ако първо дойде ")" - ще получим сигнал за
// УНБАЛАНЦЕД... реално нямаме две еднакви скоби, но пък - нямаме право да имаме първа ")" скоба
// така проверяваме и за първа скоба
string previousBracket = ")";
// нещо с диапазона има объркано тук
// за да не се бъркате, когато неработите с индекси (тогава няма как да не започнете от 0)
// може да ползвате логичното от i=1 до i<= n
//for (int i = 0; i < rangeofLines - 1; i++)
for (int i = 1; i <= rangeofLines; i++)
{
// преместил съм входа да е най-отгоре.
// вход, който се намира най-отдолу в цикъл е нелогичен и може да доведе до грешки
// (примерно ако искате да направяите скип на някой от циклите)
string line = Console.ReadLine();
if (line == "(")
{
countOpenBracket++;
// -------------------------------------------------- това е редно да стане метод ----------
// тук ще проверим дали сегашната скоба е същата като предишната
if (line == previousBracket)
{
// ако скобите са еднакви - значи резултата следва да е ЪНБАЛАНСЕД
Console.WriteLine("UNBALANCED");
return;
// ако искаме да оставим да бъде въведен целия вход на задачата =>
// няма да приключваме с return, a ще трябва да си направим една bool променлива
// някъде извън цикъла, за да може да съхраним информацията, че сме имали две
// поредни скоби - и после най-накрая да се съобразим с тази bool и да принтираме
// съобразно дали сме имали две поредни скоби
}
else
{
// ако скобите не са еднакви
previousBracket = line;
}
// ----------------------------------------------------------------------------------
}
else if (line == ")")
{
countClosedBracket++;
// -------------------------------------------------- това е редно да стане метод ----------
// тук ще проверим дали сегашната скоба е същата като предишната
if (line == previousBracket)
{
// ако скобите са еднакви - значи резултата следва да е ЪНБАЛАНСЕД
Console.WriteLine("UNBALANCED");
return;
// ако искаме да оставим да бъде въведен целия вход на задачата =>
// няма да приключваме с return, a ще трябва да си направим една bool променлива
// някъде извън цикъла, за да може да съхраним информацията, че сме имали две
// поредни скоби - и после най-накрая да се съобразим с тази bool и да принтираме
// съобразно дали сме имали две поредни скоби
}
else
{
// ако скобите не са еднакви
previousBracket = line;
}
// ----------------------------------------------------------------------------------
}
//line = Console.ReadLine();
}
//}
if (countOpenBracket == countClosedBracket)
{
Console.WriteLine("BALANCED");
}
else
{
Console.WriteLine("UNBALANCED");
}
}
}
}
Благодаря за подробното разяснение! :)