알고리즘/문제 풀이

백준 1244 - 스위치 켜고 끄기(C++)

qqlzzb 2022. 6. 21. 18:12

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

 

1244번: 스위치 켜고 끄기

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

www.acmicpc.net

풀이

정답 비율이 낮아서 지레 겁먹었는데 그냥 차근차근 풀면 되는 문제이다. 정답 비율이 낮은 것은 출력 조건까지 읽지 않은 사람이 많아서 인 것 같다.. 한 줄에 20개만 출력해야 한다는 조건이 있어서 그 조건도 출력할 때 고려해줘야 한다.

 

대단한 알고리즘이 필요한 문제는 아니고 그냥 1이 입력되면(남학생이면) 뒤에 입력받은 수의 배수들을 돌면서 값을 바꿔주고, 2가 입력되면(여학생이면) 앞뒤 배열을 살펴보며 대칭일 경우에 값을 바꿔주면 된다.

 

코드

#include <iostream>
using namespace std;
bool arr[100];

void change(int index)
{
    if(arr[index]==true) arr[index]=false;
    else arr[index] = true;
}

int main()
{
    int n;
    cin>>n;
    for(int i=0; i<n; i++)
    {
        int a;
        cin>>a;
        arr[i]=a;
    }
    int mem;
    cin>>mem;
    for(int i=0; i<mem; i++)
    {
        int a,b;
        cin>>a>>b;
        if(a==1)
        {
            for(int j=b; j<=n; j++)
            {
                if(j%b==0) change(j-1);
            }
        }
        else
        {
            change(b-1);
            int left = b-2; //(b-1)-1
            int right = b; //(b-1)+1
            while(1)
            {
                if(left<0 || right>=n) break;
                if(arr[left]==arr[right])
                {
                    change(left);
                    change(right);
                }
                else break;
                left--;
                right++;
            }
        }
    }
    for(int i=0; i<n; i++)
    {
        if(i!=0 && i%20==0) cout<<'\n';
        cout<<arr[i]<<" ";
    }
}

'알고리즘 > 문제 풀이' 카테고리의 다른 글

백준 2776 - 암기왕(C++)  (0) 2022.06.25
백준 8979 - 올림픽(C++)  (0) 2022.06.23
백준 2178 - 미로 탐색(C++)  (0) 2022.06.20
백준 4963 - 섬의 개수(C++)  (0) 2022.06.19
프로그래머스 - 전화번호 목록(c++)  (0) 2022.06.17