※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 3186번 문제인 소변기이다.
문제는 아래 링크를 확인하자.

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

 

3186번: 소변기

입력의 첫 번째 줄은 세 정수 K, L, N (1 ≤ K, L ≤ 1000, 1 ≤ N ≤ 10,000)이 있다. 두 번째 줄은 0과 1로 이루어진 길이 N의 수열이 주어진다. 이것은 주어진 시간에 센서가 기록하는 데이터를 나타낸다

www.acmicpc.net

주어지는 시각별 센서의 인식을 읽으면서, 1) "사용중"이 아닌 상태일 경우 지금까지의 연속한 '1'의 개수를 세어 그 개수가 K 이상이면 "사용중" 상태로 바꾸고 2) "사용중" 상태일 경우 지금까지의 연속한 '0'의 개수를 세어 그 개수가 L 이상이면 "완료" 수행을 한 뒤 "사용중"이 아닌 상태로 돌아가는 시뮬레이션 코드를 작성해 문제를 해결하자.

 

문자열로 주어진 시간을 모두 처리한 뒤에도 센서가 "사용중" 상태일 경우 적절한 시각 뒤에 "완료" 수행을 하게 됨을 놓치지 말자.

 

"완료" 수행을 했는지 여부를 확인하는 변수를 만들면 모든 수행을 마친 뒤 "NIKAD"를 출력할 지 여부를 결정할 수 있다.

 

아래는 제출한 소스코드이다.

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

int K, L, N;
string s;
int combo, sgn;
bool flushed;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> K >> L >> N >> s;

	for (int i = 0; i < N; i++) {
		if (sgn) {
			if (s[i] == '0') {
				combo++;
				if (combo == L) flushed = 1, cout << i + 1 << '\n', combo = 0, sgn = 0;
			}
			else combo = 0;
		}
		else {
			if (s[i] == '1') {
				combo++;
				if (combo == K) combo = 0, sgn = 1;
			}
			else combo = 0;
		}
	}

	if (sgn) flushed = 1, cout << N + (L - combo);

	if (!flushed) cout << "NIKAD";
}
728x90

+ Recent posts