[C++] 백준 1244번: 스위치 켜고 끄기

be_clever·2022년 1월 11일
0

Baekjoon Online Judge

목록 보기
24/172

문제 링크

1244번: 스위치 켜고 끄기

문제 요약

N개의 스위치의 상태가 주어지고, M명의 학생들이 주어진다. 남학생은 주어진 번호의 배수에 해당하는 스위치들의 상태를 전환한다. 여학생은 주어진 번호의 스위치로부터 대칭인 최대 구간의 스위치들의 상태를 전환한다. 이때 M명의 학생이 스위치를 조작한 후의 스위치 상태를 출력해야한다.

접근 방법

초기에 스위치를 불리언식으로 입력을 받습니다.

남학생이 하는 조작은 간단한데, 반복문을 통해서 배수에 해당하는 스위치를 반전시키면 됩니다.

여학생이 하는 조작의 경우, 대칭을 판단해야 합니다. 여기서는 두 포인터를 이용하면 됩니다. 입력받은 번호로부터 s와 e가 출발을 하고 s는 1 감소, e는 1 증가를 시킵니다. 만약 이때, s와 e의 불리언값이 다르다면 while문을 종료해야 합니다. while문의 반복은 s가 1 이상이고, e가 N 이하인 동안만 하게 됩니다. 마지막으로 구한 구간 내의 스위치의 상태를 반전시키면 됩니다.

출력이 조금 중요한데, 스위치를 20개 출력할때마다 개행을 해야 합니다. 이 조건을 제대로 읽지 않았다면, '출력 형식이 잘못되었습니다'를 받을 수도 있습니다.

코드

#include <bits/stdc++.h>

using namespace std;

bool b[101];

int main(void)
{
	int n;
	cin >> n;

	for (int i = 1; i <= n; i++)
		cin >> b[i];

	int m;
	cin >> m;

	while (m--)
	{
		int student, num;
		cin >> student >> num;

		if (student == 1)
			for (int i = num; i <= n; i += num)
				b[i] = !b[i];
		else
		{
			int s = num, e = num;
			while (s >= 1 && e <= n)
			{
				s--, e++;
				if (b[s] != b[e])
					break;
			}

			for (int i = s + 1; i <= e - 1; i++)
				b[i] = !b[i];
		}
	}

	for (int i = 1; i <= n; i++)
	{
		cout << (b[i] ? 1 : 0) << ' ';
		if (i % 20 == 0)
			cout << '\n';
	}

	return 0;
}
profile
똑똑해지고 싶어요

0개의 댓글