[백준] 1244번 스위치 켜고 끄기 / C++
#문제
#풀이
#include <iostream>
using namespace std;
bool arr[101];
void switching(int x, int y, int n)
{
if (x < 1 || y > n) return;
if (arr[x] == arr[y])
{
arr[x] = !arr[x];
arr[y] = !arr[y];
switching(x - 1, y + 1, n);
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
for (int i = 1; i <= n; ++i)
{
int x;
cin >> x;
arr[i] = x;
}
int student;
cin >> student;
for (int i = 0; i < student; ++i)
{
int x, y;
cin >> x >> y;
if (x == 1)
{
for (int j = y; j <= n; j += y)
{
arr[j] = !arr[j];
}
}
else
{
arr[y] = !arr[y];
switching(y - 1, y + 1, n);
}
}
for (int i = 1; i <= n; ++i)
{
cout << arr[i] << " ";
if (i % 20 == 0) cout << "\n";
}
return 0;
}
#정리
n개의 스위치를 순서대로 받는다. 그리고 student만큼 숫자를 두 개씩 받는데, 첫 번째 숫자가 1이면 남학생, 2면 여학생이다. 두 번째 숫자는 스위치 번호이다. 남학생이 받은 스위치 번호를 포함한 배수의 스위치를 반전시킨다. 여학생은 받은 스위치 번호를 포함해서 +1, -1 스위치가 같은 값일 경우, 다른 값 혹은 범위를 벗어날 때까지 반전시킨다. 모든 작업을 끝내고 결과를 출력하는데, 20개 한 줄씩 출력하는 문제다. 일단 스위치를 bool타입 배열로 받았다. 학생 수를 받고, 각 학생이 남학생인지 여학생인지에 따라 스위칭 수식을 적용하였다. 남학생같은 경우에는 배수로 역전시키면 됐으니 어렵지 않았다. 여학생의 경우는 받은 숫자부터 위, 아래로 최대 범위까지 반복되기 때문에 재귀함수를 사용하여 스위치를 반전시켰다. 출력할 때는 20개마다 줄바꿈을 할 수 있도록 코드를 작성하여 해결하였다.
Enjoy Reading This Article?
Here are some more articles you might like to read next: