반응형
https://www.acmicpc.net/problem/1013
1013번: Contact
입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트 케이스에 대해 전파를 표현하는, { 0, 1 }만으로 이루어진 문자열이 공백 없이 주어진다. 문자열 길이는 (1 ≤
www.acmicpc.net
문제 이해하다가 탈모 올 뻔했다.
먼저 0이 연속으로 붙어서 올 경우는 첫 번째 100+1+ 뿐이다.
따라서
1. 0 연속인 부분 ex) 1100011 => 1 XXXXXX로 지워준다.
만약 1001처럼 마지막에 1이 한 개이면 x로 바꿔준다. 10010001 이런 경우에 에러 처리 해야 하기 때문
2. 나머지 남은 부분 01 지워준다.
3. 전체 string 순회하면서 1이나 0 남아있으면 에러처리
// Contact
#include <string>
#include <vector>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
string solution(string input) {
if (input[input.size() - 1] == '0') // 0으로 끝나는거 말이안됨
return "NO";
if (input[0] == '0' && input[1] == '0')
return "NO";
// 1XXX
for (int i = 0; i + 1 < input.size(); i++) {
if (i != 0 && input[i] == '0' && input[i + 1] == '0') { // 0연속 찾았다!
int j = 0;
while (i + j + 1 < input.size() && input[i + j + 1] == '0') // 0 연속인 개수 찾음
j++;
while (i + j + 1 < input.size() && input[i + j + 1] == '1') // 1 연속인 개수 찾음
j++;
if (input[i + j] != '1') // 0011으로 끝나는 문자열
return "NO";
if (input[i - 1] == 'x')
return "NO";
if (input[i + j - 1] == '0') { // 끝에 붙는 1 하나짜리
input[i - 1] = 'x';
for (int k = 0; k <= j; k++)
input[i + k] = 'x';
} else { // 끝에 붙는 1 두개짜리
input[i - 1] = 'X';
for (int k = 0; k <= j; k++)
input[i + k] = 'X';
}
}
}
// cout << input << endl;
for (int i = 0; i + 1 < input.size(); i++) {
if (input[i] == '0' && input[i + 1] == '1') {
input[i] = 'X';
input[i + 1] = 'X';
}
}
// cout << input << endl;
for (int i = 0; i < input.size(); i++)
if (input[i] != 'X' && input[i] != 'x')
return "NO";
return "YES";
}
// (100+1+ | 01)+
int main() {
ios_base::sync_with_stdio(0);cin.tie(0);
int n;
cin >> n;
string input;
for (int i = 0; i < n; i++) {
cin >> input;
cout << solution(input) << '\n';
}
}
결정적 유한 상태 기계 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 3의 배수인 이진수만을 받아들이는 결정적 유한 오토마타의 한 예이다. 계산이론의 한 분야인 이론 전산학에서 결정적 유한 오토마타(Deterministic finite automaton
ko.wikipedia.org
뭔 DFA라는 처음 들어보는 알고리즘으로 푸는 문제였다. 그게 뭔데;;
30분 동안 고민 해보고 안되면 해답 보려 했는데 다행히 맞는 방식으로 접근해서 풀었다.
반응형
'<algorithm> > 백준' 카테고리의 다른 글
백준 2116 주사위 쌓기 c++ (0) | 2023.12.12 |
---|---|
백준 1025 제곱수 찾기 c++ (0) | 2023.11.28 |
백준 12891 DNA 비밀번호 c++ (0) | 2023.11.28 |
백준 19583 싸이버개강총회 c++ (0) | 2023.11.28 |
백준 9009 피보나치 c++ (0) | 2023.11.22 |