그럴듯한 개발 블로그
Published 2023. 11. 28. 01:23
백준 1013 Contact c++ <algorithm>/백준
반응형

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';
	}
}

https://ko.wikipedia.org/wiki/%EA%B2%B0%EC%A0%95%EC%A0%81_%EC%9C%A0%ED%95%9C_%EC%83%81%ED%83%9C_%EA%B8%B0%EA%B3%84

 

결정적 유한 상태 기계 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 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
profile

그럴듯한 개발 블로그

@donghyk2

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!