#include <iostream>
#include <stack>
using namespace std;
int main()
{
int n, cnt = 0;
stack<char> lr, sk;
cin >> n;
for (int i = 0; i < n; i++)
{
char c;
cin >> c;
if (isdigit(c))
cnt++;
else
{
if (c == 'L')
lr.push(c);
else if (c == 'S')
sk.push(c);
else if (c == 'R')
{
if (!lr.empty())
{
lr.pop();
cnt++;
}
else
break;
}
else
{
if (!sk.empty())
{
sk.pop();
cnt++;
}
else
break;
}
}
}
cout << cnt;
}
본인 코드 (시간 초과)
#include <iostream>
#include <string>
#include <list>
using namespace std;
using ll = long long;
using iter = std::list<char>::iterator;
list<char> lc;
int cnt;
bool IsMatching(char l, char r)
{
if ((l == 'L' && r == 'R') ||
(l == 'R' && r == 'L'))
return true;
if ((l == 'S' && r == 'K') ||
(l == 'K' && r == 'S'))
return true;
return false;
}
bool Check(iter left, iter right)
{
if (right == lc.end())
return false;
auto l = *left, r = *right;
if (IsMatching(l, r))
{
lc.erase(left);
lc.erase(right);
cnt++;
return true;
}
return false;
}
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
char c;
cin >> c;
if (isdigit(c))
cnt++;
else
lc.push_back(c);
}
if (lc.size() > 1)
{
auto begin = lc.begin();
auto end = ++lc.begin();
while (begin != end)
{
if (Check(begin, end))
{
begin = lc.begin();
if (begin == lc.end())
break;
end = ++lc.begin();
}
else
{
begin++;
if (begin == lc.end())
break;
end++;
}
}
}
cout << cnt;
}
'코딩테스트 > 백준' 카테고리의 다른 글
[브1] 25425 - 운동회 (0) | 2024.12.16 |
---|---|
[브1] 1356 - 유진수 (0) | 2024.12.10 |
[브2] 12605 - 단어순서 뒤집기 (0) | 2024.12.02 |
[실5] 7785 - 회사에 있는 사람 (0) | 2024.12.01 |
[실4] 14425 - 문자열 집합 (0) | 2024.12.01 |