정보/백준 문제풀이

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

FeatherCoder 2023. 12. 16. 23:33
문제 링크 : https://www.acmicpc.net/problem/1244
 

1244번: 스위치 켜고 끄기

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

www.acmicpc.net

 

 문제 풀이

이 문제는 어떤 배열을 여러번 반전 시행해서 얻어지는 최종 배열을 구하라는 문제이다. 처음 보자마자 남자와 여자가 시행하는 반전시행이 각각 독립적이므로 따로 함수를 만들어 해결해야겠다는 생각이 들었다. 남자의 경우는 배수들만 반전시켜주면 되고, 여자도 대칭적으로 같은지만 확인해주면 되는 것이기 때문에 어렵지 않았다.

 

시행 착오

마지막에 출력을 할 때 

"스위치 상태를 1번 스위치에서 시작하여 마지막 스위치까지 한 줄에 20개씩 출력한다."

 

라는 조건을 못보고 코드를 짜서 " 출력 형식이 잘못되었습니다 " 를 보게 되었다. 처음 보는 메세지여서 당황하고 있다가 문제를 다시 읽다보니 빼먹은 조건을 발견해서 다시 수정했다.

 

코드

#include <iostream>
using namespace std;

int N;
bool state[101];

void man(int n)
{
    int k = N/n;
    
    for(int i=1;i<=k;i++)
    {
        state[n*i] = !state[n*i];
    }
}

void woman(int n)
{
    state[n] = !state[n];
    int L = n-1;
    int R = n+1;
    
    while(L>=1&&R<=N)
    {
        if(state[R]!=state[L])
        {
            break;
        }
        state[R] = !state[R];
        state[L] = !state[L];
        L--;
        R++;
    }
}

int main()
{
    int S,G,SN,n;
    
    cin>>N;
    for(int i=1;i<=N;i++)
    {
        cin>>S;
        state[i] = S;
    }
    
    cin>>SN;
    for(int i=1;i<=SN;i++)
    {
        cin>>G>>n;
        if(G==1)
        {
            man(n);
        }
        else
        {
            woman(n);
        }
    }
    
    for(int i=1;i<=N;i++)
    {
        if(state[i])
        {
            cout<<1<<" ";
        }
        else
        {
            cout<<0<<" ";
        }
        if(i%20==0)
        {
            cout<<"\n";
        }
    }   
}