스위치상태
1부터 연속적으로 번호가 붙어 있는 스위치들이 있다.
스위치는 켜져 있거나 꺼져 있는 상태이다. <그림 1>에 스위치 8개의 상태가 표시되어 있다.
‘1’은 스위치가 켜져 있음을, ‘0’은 꺼져 있음을 나타낸다.
그리고 학생 몇 명을 뽑아서, 학생들에게 1이상이고 스위치 개수 이하인 자연수를 하나씩 나누어 주었다.
학생들은 자신의 성별과 받은 수에 따라 아래와 같은 방식으로 스위치를 조작하게 된다.
< 처리조건 >
(1) 남학생은 스위치 번호가 자기가 받은 수의 배수이면, 그 스위치의 상태를 바꾼다.
즉, 스위치가 켜져 있으면 끄고, 꺼져 있으면 켠다.
<그림 1>과 같은 상태에서 남학생이 3을 받았다면, 이 학생은 <그림 2>와 같이 3번, 6번 스위치의 상태를 바꾼다.
(2) 여학생은 자기가 받은 수와 같은 번호가 붙은 스위치를 중심으로 좌우가 대칭이면서 가장 많은 스위치를 포함하는 구간을 찾아서,
그 구간에 속한 스위치의 상태를 모두 바꾼다. 이 때 구간에 속한 스위치의 개수는 항상 홀수가 된다.
예를 들어 <그림 2>에서 여학생이 3을 받았다면,
3번 스위치를 중심으로 2번, 4번 스위치의 상태가 같고, 1번, 5번의 스위치 상태가 같으므로,
<그림 3>과 같이 1번부터 5번까지 스위치의 상태를 모두 바꾼다.
만약 <그림 2>에서 여학생이 4를 받았다면 3번, 5번 스위치의 상태가 서로 다르므로 4번 스위치의 상태만 바꾼다.
스위치 번호 ① ② ③ ④ ⑤ ⑥ ⑦ ⑧
스위치 상태 0 1 0 1 0 0 0 1
<그림 1>
스위치 번호 ① ② ③ ④ ⑤ ⑥ ⑦ ⑧
스위치 상태 0 1 1 1 0 1 0 1
<그림 2>
스위치 번호 ① ② ③ ④ ⑤ ⑥ ⑦ ⑧
스위치 상태 1 0 0 0 1 1 0 1
<그림 3>
입력으로 스위치들의 처음 상태가 주어지고, 각 학생의 성별과 받은 수가 주어진다.
학생들이 입력되는 순서대로 자기의 성별과 받은 수에 따라 스위치의 상태를 바꾸었을 때,
스위치들의 마지막 상태를 출력하는 프로그램을 작성하시오.
입력형식
출력형식
입력 예
8
0 1 0 1 0 0 0 1
2
1 3
2 3
출력 예
1 0 0 0 1 1 0 1
소스코드
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int a[100], n, m;
int main()
{
int i, j, k, stu, ox;
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%d", &a[i]);
scanf("%d", &m);
for (i = 0; i < m; i++)
{
scanf("%d %d", &stu, &ox);
if (stu == 1)
{
for (j = ox; j <= n; j += ox)
a[j - 1] = 1 - a[j - 1];
}
else if (stu == 2)
{
ox--;
j = k = ox;
while (1)
{
if (j < 0 || k >= n)
break;
if (a[j] != a[k])
break;
j--;
k++;
}
for (j++; j < k; j++)
a[j] = 1 - a[j];
}
}
for (i = 0; i < n; i++)
{
if (i > 0)
{
if (i % 20 == 0)
printf("\n");
else
printf(" ");
}
printf("%d", a[i]);
}
return 0;
}