[c++] BOJ 1013 :: Contact

문제

[Contact 문제 λ°”λ‘œκ°€κΈ°]

μ „νŒŒμ˜ κΈ°λ³Έ λ‹¨μœ„λŠ” { 0 , 1 } 두 κ°€μ§€λ‘œ κ΅¬μ„±λ˜μ–΄μžˆμœΌλ©°, x+ (  ) λŠ” μž„μ˜μ˜ 개수(μ΅œμ†Œ 1개) x의 반볡으둜 이루어진 μ „νŒŒμ˜ 집합을 λ‚˜νƒ€λ‚Έλ‹€.λ°˜λ³΅μ„ μ˜λ―Έν•˜λŠ” + 외에도 or λ₯Ό μ˜λ―Έν•˜λŠ” | κΈ°ν˜Έκ°€ μžˆλ‹€. { x | y } λŠ” x ν˜Ήμ€ y λ₯Ό μ˜λ―Έν•˜λŠ” κ²ƒμœΌλ‘œ, { 0+ | 1+ } λŠ” { 0 , 1 , 00 , 11 , 000 , 111 , … } 의 집합을 μ˜λ―Έν•œλ‹€. μ•„λž˜λŠ” 두 기호λ₯Ό λ³΅ν•©μ μœΌλ‘œ μ‚¬μš©ν•œ μ˜ˆμ΄λ‹€.

  • (100+1+ | 01)+

κΉ€λ™ν˜ λ°•μ‚¬λŠ” λ‹€μ–‘ν•œ μ „νŒŒ 기둝 μ€‘μ—μ„œ μœ„μ˜ νŒ¨ν„΄μ„ μ§€λ‹ˆλŠ” μ „νŒŒλ₯Ό κ°€λ €λ‚΄λŠ” ν”„λ‘œκ·Έλž¨μ„ ν•„μš”λ‘œ ν•œλ‹€. 이λ₯Ό μˆ˜ν–‰ν•  수 μžˆλŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ.

 

풀이

νŒ¨ν„΄μ΄ μ •ν•΄μ Έμžˆκ³  각 νŒ¨ν„΄μ˜ μ‹œμž‘ λ¬Έμžκ°€ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ—, 각각의 νŒ¨ν„΄μ— ν•΄λ‹Ήν•˜λŠ” 지λ₯Ό νŒλ³„ν•˜λŠ” ν•¨μˆ˜λ₯Ό ν•˜λ‚˜ μ‚¬μš©ν•˜λ©΄ λœλ‹€. ν•˜μ§€λ§Œ λ‹€μ–‘ν•œ νŒ¨ν„΄μœΌλ‘œ 해석될 수 μžˆλŠ” κ²½μš°κ°€ μžˆλŠ”λ°, λ‹€μŒκ³Ό 같은 κ²½μš°μ΄λ‹€.

011000111001

처음 ν’€μ—ˆμ„ λ•Œ "01", "100,,,1,,," νŒ¨ν„΄μ„ μ‘°μ‚¬ν•˜λ©΄μ„œ ν›„μžμ˜ νŒ¨ν„΄μ—μ„œ 1 이후에 μ˜€λŠ” 0을 μ°ΎλŠ” μ‹μœΌλ‘œ 풀이λ₯Ό κ΅¬μ„±ν•˜μ˜€λ‹€. κ·Έλ ‡κ²Œ ν•˜λ‹ˆ μœ„μ˜ νŒ¨ν„΄μ€ "01 1000111 001"둜 해석될 수 μžˆλŠ”λ° 이후에 λ‚˜μ˜€λŠ” 001이 아무 νŒ¨ν„΄κ³Όλ„ μΌμΉ˜ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ NOλ₯Ό 좜λ ₯ν•˜κ²Œ λ˜μ–΄λ²„λ Έλ‹€. ν•˜μ§€λ§Œ ν•΄λ‹Ή νŒ¨ν„΄μ€ "01 100011 1001"으둜 "YES"λ₯Ό 좜λ ₯ν•΄μ•Ό ν•˜λŠ” μ˜ˆμ œμ΄λ‹€. λ”°λΌμ„œ 100+1+ νŒ¨ν„΄μ—μ„œ 1의 κ°œμˆ˜μ— 따라 λͺ¨λ“  경우의 수λ₯Ό μ²΄ν¬ν•˜λŠ” λ°©μ‹μœΌλ‘œ λ³€κ²½ν•˜μ˜€κ³ , 그러기 μœ„ν•΄μ„œ μž¬κ·€λ‘œ ν•¨μˆ˜λ₯Ό κ΅¬μ„±ν•˜μ˜€λ‹€.

 

μ½”λ“œ

#include <iostream>
#include <string>
using namespace std;

int findPattern(string str){ // 0:YES, 1:NO
	if(str.length() == 0) return 0;
	if(str[0] == '0'){ // 01 νŒ¨ν„΄
		if(str.length() >= 2 && str[1] == '1'){
			str = str.substr(2);
			return findPattern(str); // νŒ¨ν„΄ 제거 ν›„ μž¬κ·€
		}
		return 1;
	}else{ // 100+1+ νŒ¨ν„΄
		if(str.length() >= 4 && str.substr(0, 3) == "100"){
			str = str.substr(3); // 100 제거
			int startIdx = str.find('1');
			if(startIdx == string::npos){ // 1이 μ—†μœΌλ©΄ μ‹€νŒ¨
				return 1;
			}
            
			str = str.substr(startIdx); // 1 μ΄μ „μ˜ λ¬Έμžλ“€ 제거
			while(str.length() >= 1 && str[0] == '1'){
            	// 문자λ₯Ό ν•˜λ‚˜μ”© μ œκ±°ν•΄κ°€λ©° μ„±κ³΅ν•˜λŠ” κ²½μš°κ°€ λ‚˜μ˜¬ λ•ŒκΉŒμ§€ 체크
				str = str.substr(1);
				if(findPattern(str) == 1){
					continue;
				}
				return 0; // 성곡
			}
			return findPattern(str); // νŒ¨ν„΄ 제거 ν›„ μž¬κ·€
		}
		return 1;
	}
}

int main() {
	int T; cin >> T;
	while(T--){
		string str; cin >> str;
        
		if(findPattern(str) == 1) cout << "NO" << '\n';
		else cout << "YES" << '\n';
	}
}

 

κ²°κ³Ό

 

증말 μˆμ½”λ”© λͺ»ν•˜λŠ” λ‚˜ γ…Ž...

λ°˜μ‘ν˜•

'Algorithm 문제 > BOJ' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[c++] BOJ 9342 :: 염색체  (0) 2021.11.03
[c++] BOJ 14906 :: μŠ€λŸ¬ν”Ό(Slurpys)  (0) 2021.11.03
[c++] BOJ 20040 :: 사이클 κ²Œμž„  (0) 2021.10.10
[c++] BOJ 7579 :: μ•±  (0) 2021.10.10
[c++] BOJ 1501 :: μ˜μ–΄ 읽기  (0) 2021.10.07