Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

사고쳤어요

[백준] 1343 폴리오미노(C++) 본문

백준/Silver

[백준] 1343 폴리오미노(C++)

kevinmj12 2023. 2. 10. 16:38

링크: https://www.acmicpc.net/problem/1343

 

1343번: 폴리오미노

첫째 줄에 사전순으로 가장 앞서는 답을 출력한다. 만약 덮을 수 없으면 -1을 출력한다.

www.acmicpc.net

문제

민식이는 다음과 같은 폴리오미노 2개를 무한개만큼 가지고 있다. AAAA와 BB

이제 '.'와 'X'로 이루어진 보드판이 주어졌을 때, 민식이는 겹침없이 'X'를 모두 폴리오미노로 덮으려고 한다. 이때, '.'는 폴리오미노로 덮으면 안 된다.

폴리오미노로 모두 덮은 보드판을 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 보드판이 주어진다. 보드판의 크기는 최대 50이다.

출력

첫째 줄에 사전순으로 가장 앞서는 답을 출력한다. 만약 덮을 수 없으면 -1을 출력한다.

 


풀이

 보드판을 앞에서부터 'X'일 경우에는 카운터에 +1을 시킨다. 이후 카운터가 4가 될 때마다 'AAAA'를 추가해준다. (사전순으로 가장 앞서기 위해선 AAAA가 우선적으로 출력되어야 한다.)

 이외에 '.'이 나올 때는 카운터가 0이면 '.'을, 2면 'BB.'을 추가하고 0 또는 2가 아니라면 -1을 출력한뒤 리턴해준다.

 

#include <iostream>
#include <string>
using namespace std;

int main(){
    char board[51];
    string answer;
    cin >> board;

    int counter = 0; // counter로 X의 개수 측정
    for (int i = 0; i < 51; i++){
        if (counter == 4){ // X가 4개이면 정답에 AAAA 추가 후 counter값 초기화
            answer += "AAAA";
            counter = 0;
        }
        if (board[i] == 'X'){ // X 이면 counter에 1 추가 후 진행
            counter++;
            continue;
        }
        else if (board[i] == '.'){ // . 이면 counter의 개수에 따라 진행
            if (counter == 0){
                answer += ".";
            }
            else if (counter == 2){
                answer += "BB.";
                counter = 0;
            }
            else{
                cout << -1;
                return 0;
            }
        }
        else{ // board가 끝났을 때
            if (counter == 0){
                break;
            }
            else if (counter == 2){
                answer += "BB";
                break;
            }
            else{
                cout << -1;
                return 0;
            }
        }
        
    }
    cout << answer;

}