PS_Baekjoon

[백준 C++] 1244번 : 스위치 켜고 끄기

SMILELY 2023. 4. 4. 11:53

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

 

1244번: 스위치 켜고 끄기

첫째 줄에는 스위치 개수가 주어진다. 스위치 개수는 100 이하인 양의 정수이다. 둘째 줄에는 각 스위치의 상태가 주어진다. 켜져 있으면 1, 꺼져있으면 0이라고 표시하고 사이에 빈칸이 하나씩

www.acmicpc.net

풀이 : 
- 문제에서 요구하는 것을 그대로 구현하는 문제
- 남학생은 받은 수의 배수인 인덱스의 스위치를 반대로 한다
   i에 받은 수를 더해가며 i를 배수로 만들어준다
-여학생은 받은 수의 양쪽의 인덱스의 스위치가 대칭하지 않을 때까지 반복문을 돌리면서 그 구간 안에 있는 인덱스들
   즉, 대칭하는 인덱스의 스위치를 모두 반대로 한다
- 출력 예시 부분을 안 읽었더니 20개씩 끊어서 출력하는 줄 몰라서 계속 틀렸다 문제를 자세히 보자!
 
코드 :

#include <iostream>
#include <algorithm>
using namespace std;

int main(){
    cin.tie(NULL);
    ios::sync_with_stdio(false);

    int n, m, gender, num;
    bool tab[105];

    cin >> n;
    for(int i=1; i<=n; i++){ //인덱스 계산이 쉽도록 배열은 1부터 시작
        cin >> tab[i];
    }
    cin >> m;
    while(m--){
        cin >> gender >> num;
        if(gender == 1){ //남학생일 경우
            for(int i=num; i<=n; i += num){ //i에 수를 더해가며 수의 배수로 이동
                tab[i] = !tab[i]; //반대로 바꾼다
            }
        }else{ //여학생일 경우
            tab[num] = !tab[num]; //수의 양쪽을 검사하기 때문에 미리 반대로 바꾼다
            for(int i=1; num-i>0&&i+num<=n; i++){ //점점 범위를 넓혀가는데 0과 같아지거나 n보다 커지면 반복문 종료
                if(tab[num+i] != tab[num-i]){ //대칭이 아니라면 종료
                    break;
                }
                tab[num+i] = !tab[num+i]; //수의 오른쪽에 있는 스위치를 반대로 한다
                tab[num-i] = !tab[num-i]; //수의 왼쪽에 있는 스위치를 반대로 한다
            }
        }
    }
    for(int i=1; i<=n; i++){
        cout << tab[i] << ' ';
        if(i%20 == 0){ // 20개씩 끊어서 출력
            cout << '\n';
        }
    }
    cout << '\n';
}