본문 바로가기

코드포스

[코드포스 Practice16] B. Blocks

 

이건.. 다 풀었는데도 이렇게 하는 게 맞나 싶었음..

아닌 경우를 생각했는데 괜히 이거 말고 다른 경우가 있나 싶고.. 확실치 않아서 좀 찜찜했다

 

 

아무튼 처음에 봤을 때 딱 든 생각이 이거 어케하지????였음

그러다 걍 전에 비슷한 문제 푼 것 처럼 했다. 

 

먼저 -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문 한번만 돌아도 될 것 같다. 암튼 끝... 휴 ^~^