[백준] 1244 스위치 켜고 끄기 C++알고리즘/백준2026. 1. 22. 15:08
Table of Contents


해설 및 풀이
남자인 경우 배수에 해당하는 부분들에 대해서 다 반전을 시키고,
여자인 경우 입력받은 수 num을 기준으로 양옆의 수가 대칭이라면 반전 시키고 더이상 반전 시킬 수가 없을 때 까지 반복하면 되는 문제이다.
여자 부분이 조금 까다로운데, 본인은 while문과 left, right를 두어 범위를 확인했고 left, right가 대칭인지 아닌지를 확인하는 식으로 스위치를 반전 시켜나갔다.
계산의 편의성을 위해 비트 연산자 ^=(XOR) 를 사용하여 빠르게 반전 시켜나갔다.
(참고로 마지막 출력문에 i % 20 을 주의하자.)
코드
#include <iostream>
#include <string>
#include <queue>
#include <map>
#include <algorithm>
#include <stack>
#include <sstream>
#include <set>
#include <unordered_set>
#include <cmath>
using namespace std;
using ll = long long;
const int MAX = 104;
int arr[MAX];
int n, cnt;
int main()
{
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
cin >> n;
for (int i = 1; i <= n; ++i) cin >> arr[i];
cin >> cnt;
for (int i = 0; i < cnt; ++i)
{
int gen, num;
cin >> gen >> num;
if (gen == 1) // 남자
{
for (int j = num; j <= n; j += num) // 배수에 대해서 다 뒤집는다.
arr[j] ^= 1;
}
else if (gen == 2) // 여자
{
int left = num - 1, right = num + 1; // 2 4
arr[num] ^= 1; // 뒤집는다
bool same = true;
if ((left >= 1 && right <= n) == false) // 범위를 벗어난다
same = false;
while (same)
{
if ((left >= 1 && right <= n))
{
// 범위 안에 들어온다면 left, right 계산해서 같은지 아닌지 비교한다.
if (arr[left] == arr[right]) // 대칭이라면
{
arr[left] ^= 1;
arr[right] ^= 1;
left--;
right++;
}
else // 대칭이 아니라면 while 나간다
{
same = false;
}
}
else same = false;
}
}
}
for (int i = 1; i <= n; ++i)
{
if (i % 20)
cout << arr[i] << ' ';
else
cout << arr[i] << endl;
}
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
| [백준] 14889 스타트와 링크 C++ (0) | 2026.01.23 |
|---|---|
| [백준] 1063 킹 C++ (0) | 2026.01.23 |
| [백준] 2108 통계학 C++ (0) | 2026.01.22 |
| [백준] 3048 개미 C++ (0) | 2026.01.21 |
| [백준] 1182 부분수열의 합 C++ (0) | 2025.05.05 |
@CGNY :: 김놀자
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!