[C++] 백준 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;
}
Author And Source
이 문제에 관하여([C++] 백준 1244번: 스위치 켜고 끄기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@beclever/C-백준-1244번-스위치-켜고-끄기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)