알고리즘

C++ 알고리즘 - 1244 스위치 켜고 끄기

마루설아 2025. 2. 10. 20:37

https://www.acmicpc.net/problem/1244

 

#include <bits/stdc++.h>
#define endl "\n"

using namespace std;

/******** 전역변수 ********/


/******** 함    수 ********/


int main(void) {
	/******** C++ INIT ********/
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	/******** 지역변수 ********/
	int input1;
	int input2;
	int state;
	int sexual;
	int number;

	vector<int> light;

	/******** 구    현 ********/
	cin >> input1;

	// 스위치 상태 벡터에 삽입
	for (int i = 0; i < input1; i++) {
		cin >> state;
		light.push_back(state);
	}

	// 학생과 수 받기
	cin >> input2;
	for (int i = 0; i < input2; i++) {
		cin >> sexual >> number;

		// 남자라면
		if (sexual == 1) {
			// 받은 수의 배수에 해당되는 스위치를 반전
			for (int j = number - 1; j < light.size(); j += number) {
				if (light[j] == 1) light[j] = 0;
				else light[j] = 1;
			}
		}

		// 여자라면
		else if (sexual == 2){
			// 받은 수를 기준으로 양쪽으로 이동
			for (int j = number - 1, k = number - 1; j < light.size() && k >= 0; j++, k--) {
				// 양 스위치가 같다면
				if (light[j] == light[k]) {
					// 스위치 반전
					if (light[j] == 1) light[j] = 0;
					else light[j] = 1;

					// 스위치 위치가 같다면 PASS
					if (j == k) continue;

					// 스위치 위치가 다르다면 반전
					if (light[k] == 1) light[k] = 0;
					else light[k] = 1;
				}

				else break;
			}
		}
	}

	// 스위치 출력
	for (int i = 0; i < light.size(); i++) {
		if (i != 0 && i % 20 == 0) cout << endl;
		cout << light[i] << " ";		
	}
}