본문 바로가기
🥇Baekjoon Solutions/기타

[C++] 백준 2671번: 잠수함식별

by 코푸는 개발자 2021. 9. 25.
728x90

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

 

2671번: 잠수함식별

입력에 들어있는 스트링을 읽고, 이것이 잠수함의 엔진소리를 나타내는 스트링인지 아니면 그냥 물속의 잡음인지를 판정한 후, 잠수함의 엔진 소리에 해당하는 스트링이면 "SUBMARINE"을 출력하고

www.acmicpc.net

 

조건
(100~1~|01)~
-> 100~1~과 01을 임의로 섞어서 만들 수 있는 모든 스트링의 집합
앞에서 부터 조건별로 제거해줌
경우의수 
1. 100~1~ + 100~1~ (접합마디가 1100으로 이어짐)
2. 100~1~ + 01(101존재)
3. 01 + 100~1~
4. 01 + 01
5. 01 끝

6. 100~1~ 끝

위 경우들과 예외처리부분을 해결해주면 문제를 해결할 수 있습니다.

*예외처리부분이 많아 처리과정이 복잡했습니다.

#include <iostream>
#include <vector>

using namespace std;

void solution(string s) {
	vector<string>v;
	string t;
	int count, check;//count: 연속된 1을 셈, check: 해당 과정을 수행하는데 앞부분이 제거되었는지 확인(과정을 거치고 이전과 사이즈가 같다면 예외처리)
	bool conti1;
	while (s.size() != 0) {
		t = "";
		count = 0;
		conti1 = false;//check:1이 연속되는지 확인 & 1이 시작되었는지 확인
		if (s[0] == '0' && s[1] == '1')//제일 앞 01패턴 추출(3, 4, 5번 경우 해결)
			s.erase(0, 2);
		else if (s.size() < 4) {//01이 아닌 사이즈가 1~3인 문자열은 조건에 해당x(예외처리)
			cout << "NOISE";
			return;
		}
		else if (s.substr(0, 3) == "100") {
			t += s.substr(0, 3);
			check = s.size();
			for (int i = 3; i < s.size(); i++) {
				if (s[i] == '0' && count == 0);
				else {//s[i] = '1' 시작
					conti1 = true;
					if (count == 0)
						count++;
					else if (s[i] == '0') {//c>0
						conti1 = false;
						if (i == s.size() - 1) {
							cout << "NOISE";
							return;
						}
						else {
							if (s[i + 1] == '1') {//2번 해결
								s.erase(0, i);
								break;
							}
							else if (s[i - 2] == '1' && s[i - 1] == '1' && s[i + 1] == '0') {//1번 해결
								s.erase(0, i - 1);
								break;
							}
							else {
								cout << "NOISE";
								return;
							}
						}
					}
					else if (s[i - 1] == '1')
						count++;
				}
			}
			if (conti1 == true)//100...1..1의 형태 제거 (6번 해결)
				s.clear();

			if (s.size() == check) {//(예외처리)
				cout << "NOISE";
				return;
			}
		}
		else {
			cout << "NOISE";
			return;
		}
	}
	cout << "SUBMARINE";
}

int main() {
	string s;

	cin >> s;

	solution(s);

	return 0;
}
728x90

'🥇Baekjoon Solutions > 기타' 카테고리의 다른 글

[C++] 백준 11005번: 진법 변환2  (0) 2021.09.24
[C++] 백준 10844번: 쉬운 계단 수  (0) 2021.07.28
[C++] 백준 2108번: 통계학  (0) 2021.07.28

댓글