https://www.acmicpc.net/problem/1343
1343번: 폴리오미노
첫째 줄에 사전순으로 가장 앞서는 답을 출력한다. 만약 덮을 수 없으면 -1을 출력한다.
www.acmicpc.net
풀이 :
- X와 .로 이루어진 문자열이 주어지고, X는 A나 B로 덮어서 새로운 문자열을 만든 뒤 출력한다
- A와 B의 갯수가 4와 2로 짝수로만 주어지기 때문에 X의 갯수가 홀수라면 덮을 수 없고 -1일 출력한다
- .를 만나기 전까지 X의 갯수를 세어주고, .를 만나면 세어준 갯수에 따라 덮거나 반복문을 종료해준다.
코드 :
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main(){
cin.tie(NULL);
ios::sync_with_stdio(false);
int cnt = 0; //X의 갯수를 세어줄 변수 선언
string s, ans; //입력받을 문자열과 복사해준 문자열 선언
bool res = true; //덮을 수 있는 문자열인지 아닌지 판별할 bool 변수 선언
cin >> s;
s += '.'; //마지막에 .이 와야 따로 검사하지 않게 됨
for(int i=0; i<s.size(); i++){
if(s[i] == 'X'){ //X가 나올 때는 카운트만 해준다
cnt++;
}else{ //.을 기준으로 cnt를 고려
if(cnt > 0){ //cnt가 0보다 크다는건 직전 값이 X였다는 것
if(cnt % 2 != 0){ //A와 B는 짝수라서 홀수일 경우 덮을 수 없다
res = false; //따라서 res에 false 값 넣어주고 break한다
break;
}
while(cnt){ //짝수일 경우 break되지 않아, cnt의 값이 0이 될 때가지 while문이 돈다.
if(cnt/4 > 0){ //사전순으로 출력하라고 했기 때문에 4보다 크면 A부터 넣어줘야 한다
ans += "AAAA";
cnt -= 4;
}else{ //4보다 작으면 B를 넣어준다
ans += "BB";
cnt -= 2;
}
}
}
ans += '.'; //.는 덮을 수 없기 때문에 .를 그대로 복사해준다
cnt = 0;
}
}
ans[ans.size()-1] = '\n'; //아까 검사를 위해 넣어준 .도 복사했기 때문에 개행문자로 바꿔준다
(res ? cout << ans : cout << -1 << '\n'); //res의 값이 true일 경우 덮어씌어준 답을 출력하고, false라면 -1이 출력된다
}
'PS_Baekjoon' 카테고리의 다른 글
[백준 C++] 11441번 : 합 구하기 (1) | 2023.03.19 |
---|---|
[백준 C++] 1213번 : 펠린드롬 만들기 (0) | 2023.03.18 |
[백준 C++] 2161번 : 카드1 (0) | 2023.03.16 |
[백준 C++] 11728번 : 배열 합치기 (0) | 2023.03.15 |
[백준 C++] 1417번 : 국회의원 선거 (1) | 2023.03.14 |