[c++] 백준 1343 : 폴리오미노

728x90

[c++] 백준 1343 : 폴리오미노

🥈실버 5

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

 

1343번: 폴리오미노

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

www.acmicpc.net


접근

입력값을 순회하면서 X를 만나면 count 변수를 1씩 증가시킨다.

 

XX를 처리해야 하는 경우는 크게 두가지가 있다.

1. XX 다음 X가 오지 않을때(.이 오거나 맨 끝의 경우)

-> AAAA가 들어갈 때까지 더 기다릴 필요가 없으므로 BB를 박는다.

2. XX 다음 X가 올 때

-> 더 기다리면 AAAA를 박을 수 있으므로 처리하지 않는다.

 

이렇게 진행하다가 count가 4가 되면 AAAA를 박는다.

 

.이 오는 경우의 처리

count가 홀수가 되는 경우 -1 출력하고 프로그램을 종료한다. (XXX. 같은 경우에는 AAAA나 BB를 박을 수 없는 상황이기 때문)

정답으로 출력할 변수에 .을 더한다.

count를 0으로 초기화한다.

 

입력받은 반복문의 순회가 끝나고 난 후

예제 케이스처럼 X가 입력값으로 오는 경우를 생각해보면, 단순히 count를 1만 시키고 반복문을 빠져 나왔기 때문에

count변수가 0이 아닌 경우에도 -1을 출력하도록 해주어야 한다.

 

코드

#include <bits/stdc++.h>
using namespace std;
int main() {
  string input;
  cin >> input;
  int cnt = 0;
  string result;
  input += ' ';
  for (int i = 0; i < input.size()-1; i++) {
    if (input[i] == 'X') {
      cnt++;
    }
    if (cnt == 2 && (input[i+1] != 'X')) { // BB박기
      result += "BB";
      cnt = 0;
    }
    if (cnt == 4) {
      result += "AAAA";
      cnt = 0;
    }
    if (input[i] == '.') {
      
      if (cnt % 2 == 1) {
        cout << -1;
        return 0;
      }
      result += '.';
      cnt = 0;
    }
  }
  if (cnt != 0) cout << -1;
  else cout << result;
  return 0;
}

 

 

728x90