이건.. 다 풀었는데도 이렇게 하는 게 맞나 싶었음..
아닌 경우를 생각했는데 괜히 이거 말고 다른 경우가 있나 싶고.. 확실치 않아서 좀 찜찜했다
아무튼 처음에 봤을 때 딱 든 생각이 이거 어케하지????였음
그러다 걍 전에 비슷한 문제 푼 것 처럼 했다.
먼저 -1인 경우 제외하기..
규칙 보니깐 길이가 짝수인데 b, w가 홀수 개 이면 안 되는 것 같아서 제외했다.
다음으로 문자열을 바꿔가면 되는데 이걸 난 전부 W로 만들려했다.
어차피 바꾸는 횟수가 생관없고 B, W 색깔 따져가며 하기 싫어서 다 W로 만들어버리자!로 정했음.
이 다음 푼 건 감인데 (그래서 엄청 찜찜했음)
뭔가 B를 전부 뒤로 밀어버리고 BB를 WW로 바꾸면 되겠다 싶었다.
그래서 BW -> WB로 BB -> WW로 바꾸게끔 짰다.
그런데 뭔가 이걸 한 번만에 못 하고 여러번 돌려야지 짤 수 있을 것 같아서 while문으로 w 개수가 n이 될 때까지 돌렸다.
이렇게 짜서 제출했더니 타임아웃ㅎㅎ
while문에서 예외 있을 것 같아서 나중에 다시 보자하고 C 풀러 갔다.
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <stack>
using namespace std;
using i64 = long long;
int main() {
int n;
scanf("%d", &n);
string s;
cin >> s;
int w = 0, b = 0;
for (int i = 0; i < s.size(); i++)
{
if (s[i] == 'W')
w++;
else
b++;
}
if ((n%2==0) && (w%2==1) && (b%2==1))
{
printf("-1");
return 0;
}
vector<int> ans;
while (w != n)
{
for (int i = 0; i < n - 1; i++)
{
if (s[i] == 'B')
{
ans.push_back(i);
if (s[i+1] == 'W')
{
s[i] = 'W';
s[i+1] = 'B';
}
else
{
s[i] = 'W';
s[i+1] = 'W';
w += 2;
b -= 2;
}
}
}
}
cout << ans.size() << endl;
for (int i = 0; i < ans.size(); i++)
{
cout << ans[i] + 1 << " ";
}
return 0;
}
이제 어디서 틀렸는지 예외 찾으려고 1 ~ 3길이의 모든 경우를 다 넣어봤다.
보니깐 전부 B이거나 W인 경우에서 문제 있는 것 같아 b == n || w == n인 경우 0 출력하게끔 조건 추가했다.
결과는 틀림,, 이게 문제가 아닌 것 같아서 다시 예제를 돌려봤다.
알고보니 3 WWB 이렇게 B가 따로 남았을 때 문제가 생긴다. 코드를 짤 때 BW를 WB로 바꾸게는 했지만 BW를 WB로 바꾸는 건 구현을 안 했다.
이걸 어찌할까 고민하다가 시간이 정말 얼마 안 남아서 그냥 W로 전부 바꾸기, B로 전부 바꾸기 두 번 생각했다. 이걸 함수로 짜면 편했겠지만 10분안에 짤 수 있을 것 같지 않아서 코드 복사하고 입력 받은 것도 복사하고 .../// 좀 더럽게 복사했다.
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <stack>
using namespace std;
using i64 = long long;
int main() {
int n;
scanf("%d", &n);
string s;
cin >> s;
vector<char> cpy(n);
for(int i = 0; i < n; i++)
{
cpy[i] = s[i];
}
int w = 0, b = 0;
for (int i = 0; i < s.size(); i++)
{
if (s[i] == 'W')
w++;
else
b++;
}
int wc = w, bc = b;
if ((n%2==0) && (w%2==1) && (b%2==1))
{
printf("-1");
return 0;
}
if ((b==n) || (w==n))
{
printf("0");
return 0;
}
vector<int> ans;
//while (w != n)
{
for (int i = 0; i < n - 1; i++)
{
if (s[i] == 'B')
{
ans.push_back(i);
if (s[i+1] == 'W')
{
s[i] = 'W';
s[i+1] = 'B';
}
else
{
s[i] = 'W';
s[i+1] = 'W';
w += 2;
b -= 2;
}
}
}
}
if (w != n)
{
vector<int> ans2;
//while (w != n)
{
for (int i = 0; i < n - 1; i++)
{
if (cpy[i] == 'W')
{
ans2.push_back(i);
if (cpy[i+1] == 'B')
{
cpy[i] = 'B';
cpy[i+1] = 'W';
}
else
{
cpy[i] = 'B';
cpy[i+1] = 'B';
wc += 2;
bc -= 2;
}
}
}
}
cout << ans2.size() << endl;
for (int i = 0; i < ans2.size(); i++)
{
cout << ans2[i] + 1 << " ";
}
}
else
{
cout << ans.size() << endl;
for (int i = 0; i < ans.size(); i++)
{
cout << ans[i] + 1 << " ";
}
}
return 0;
}
ㅎㅎ... ^////^
전부 W로 만들게끔 하다가 만약 w == n이 아니면 전부 B로 만들게 했다.
이전에 while문 넣었던 건 필요없는 코드인 것 같아 없앴다.
while 없애도 될지 안 될지 몰라서 긴장했는데 다행히 맞았다.
지금 다 제출하고 생각해보니 반복문에서 i가 이동할 때마다 자신의 왼쪽에 있는 부분은 전부 W임이 보장되니 for문 한번만 돌아도 될 것 같다. 암튼 끝... 휴 ^~^
'코드포스' 카테고리의 다른 글
[코드포스 Practice15] E. Crazy Town (0) | 2020.04.04 |
---|---|
[코드포스 Practice16] C. Strongly Connected City (0) | 2020.03.27 |
[코드포스 Practice16] A. Tanya and Toys (0) | 2020.03.27 |
[코드포스 Practice16] 후기 (0) | 2020.03.27 |
[코드포스 Practice15] D. Queue (0) | 2020.03.21 |