πŸ•οΈ ICPC Sinchon/Simulation

[BOJ S4][C++] λ°±μ€€ 1244번: μŠ€μœ„μΉ˜ 켜고 끄기

선달 2022. 10. 17. 18:29
λ°˜μ‘ν˜•

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

 

1244번: μŠ€μœ„μΉ˜ 켜고 끄기

첫째 μ€„μ—λŠ” μŠ€μœ„μΉ˜ κ°œμˆ˜κ°€ 주어진닀. μŠ€μœ„μΉ˜ κ°œμˆ˜λŠ” 100 μ΄ν•˜μΈ μ–‘μ˜ μ •μˆ˜μ΄λ‹€. λ‘˜μ§Έ μ€„μ—λŠ” 각 μŠ€μœ„μΉ˜μ˜ μƒνƒœκ°€ 주어진닀. 켜져 있으면 1, 꺼져있으면 0이라고 ν‘œμ‹œν•˜κ³  사이에 빈칸이 ν•˜λ‚˜μ”©

www.acmicpc.net

 

문제

1λΆ€ν„° μ—°μ†μ μœΌλ‘œ λ²ˆν˜Έκ°€ λΆ™μ–΄μžˆλŠ” μŠ€μœ„μΉ˜λ“€μ΄ μžˆλ‹€. μŠ€μœ„μΉ˜λŠ” 켜져 μžˆκ±°λ‚˜ κΊΌμ ΈμžˆλŠ” μƒνƒœμ΄λ‹€. <κ·Έλ¦Ό 1>에 μŠ€μœ„μΉ˜ 8개의 μƒνƒœκ°€ ν‘œμ‹œλ˜μ–΄ μžˆλ‹€. ‘1’은 μŠ€μœ„μΉ˜κ°€ 켜져 μžˆμŒμ„, ‘0’은 κΊΌμ Έ μžˆμŒμ„ λ‚˜νƒ€λ‚Έλ‹€. 그리고 학생 λͺ‡ λͺ…을 λ½‘μ•„μ„œ, ν•™μƒλ“€μ—κ²Œ 1 이상이고 μŠ€μœ„μΉ˜ 개수 μ΄ν•˜μΈ μžμ—°μˆ˜λ₯Ό ν•˜λ‚˜μ”© λ‚˜λˆ„μ–΄μ£Όμ—ˆλ‹€. 학생듀은 μžμ‹ μ˜ 성별과 받은 μˆ˜μ— 따라 μ•„λž˜μ™€ 같은 λ°©μ‹μœΌλ‘œ μŠ€μœ„μΉ˜λ₯Ό μ‘°μž‘ν•˜κ²Œ λœλ‹€.

남학생은 μŠ€μœ„μΉ˜ λ²ˆν˜Έκ°€ μžκΈ°κ°€ 받은 수의 배수이면, κ·Έ μŠ€μœ„μΉ˜μ˜ μƒνƒœλ₯Ό λ°”κΎΌλ‹€. 즉, μŠ€μœ„μΉ˜κ°€ 켜져 있으면 끄고, κΊΌμ Έ 있으면 μΌ λ‹€. <κ·Έλ¦Ό 1>κ³Ό 같은 μƒνƒœμ—μ„œ 남학생이 3을 λ°›μ•˜λ‹€λ©΄, 이 학생은 <κ·Έλ¦Ό 2>와 같이 3번, 6번 μŠ€μœ„μΉ˜μ˜ μƒνƒœλ₯Ό λ°”κΎΌλ‹€.

여학생은 μžκΈ°κ°€ 받은 μˆ˜μ™€ 같은 λ²ˆν˜Έκ°€ 뢙은 μŠ€μœ„μΉ˜λ₯Ό μ€‘μ‹¬μœΌλ‘œ μ’Œμš°κ°€ λŒ€μΉ­μ΄λ©΄μ„œ κ°€μž₯ λ§Žμ€ μŠ€μœ„μΉ˜λ₯Ό ν¬ν•¨ν•˜λŠ” ꡬ간을 μ°Ύμ•„μ„œ, κ·Έ ꡬ간에 μ†ν•œ μŠ€μœ„μΉ˜μ˜ μƒνƒœλ₯Ό λͺ¨λ‘ λ°”κΎΌλ‹€. μ΄λ•Œ ꡬ간에 μ†ν•œ μŠ€μœ„μΉ˜ κ°œμˆ˜λŠ” 항상 ν™€μˆ˜κ°€ λœλ‹€.

μŠ€μœ„μΉ˜ λ²ˆν˜ΈμŠ€μœ„μΉ˜ μƒνƒœ
β‘  β‘‘ β‘’ β‘£ β‘€ β‘₯ ⑦ ⑧
0 1 0 1 0 0 0 1

<κ·Έλ¦Ό 1>

예λ₯Ό λ“€μ–΄ <κ·Έλ¦Ό 2>μ—μ„œ 여학생이 3을 λ°›μ•˜λ‹€λ©΄, 3번 μŠ€μœ„μΉ˜λ₯Ό μ€‘μ‹¬μœΌλ‘œ 2번, 4번 μŠ€μœ„μΉ˜μ˜ μƒνƒœκ°€ κ°™κ³  1번, 5번 μŠ€μœ„μΉ˜μ˜ μƒνƒœκ°€ κ°™μœΌλ―€λ‘œ, <κ·Έλ¦Ό 3>κ³Ό 같이 1λ²ˆλΆ€ν„° 5λ²ˆκΉŒμ§€ μŠ€μœ„μΉ˜μ˜ μƒνƒœλ₯Ό λͺ¨λ‘ λ°”κΎΌλ‹€. λ§Œμ•½ <κ·Έλ¦Ό 2>μ—μ„œ 여학생이 4λ₯Ό λ°›μ•˜λ‹€λ©΄, 3번, 5번 μŠ€μœ„μΉ˜μ˜ μƒνƒœκ°€ μ„œλ‘œ λ‹€λ₯΄λ―€λ‘œ 4번 μŠ€μœ„μΉ˜μ˜ μƒνƒœλ§Œ λ°”κΎΌλ‹€.

μŠ€μœ„μΉ˜ λ²ˆν˜ΈμŠ€μœ„μΉ˜ μƒνƒœ
β‘  β‘‘ β‘’ β‘£ β‘€ β‘₯ ⑦ ⑧
0 1 1 1 0 1 0 1

<κ·Έλ¦Ό 2>

μŠ€μœ„μΉ˜ λ²ˆν˜ΈμŠ€μœ„μΉ˜ μƒνƒœ
β‘  β‘‘ β‘’ β‘£ β‘€ β‘₯ ⑦ ⑧
1 0 0 0 1 1 0 1

<κ·Έλ¦Ό 3>

μž…λ ₯으둜 μŠ€μœ„μΉ˜λ“€μ˜ 처음 μƒνƒœκ°€ 주어지고, 각 ν•™μƒμ˜ 성별과 받은 μˆ˜κ°€ 주어진닀. 학생듀은 μž…λ ₯λ˜λŠ” μˆœμ„œλŒ€λ‘œ 자기의 성별과 받은 μˆ˜μ— 따라 μŠ€μœ„μΉ˜μ˜ μƒνƒœλ₯Ό λ°”κΎΈμ—ˆμ„ λ•Œ, μŠ€μœ„μΉ˜λ“€μ˜ λ§ˆμ§€λ§‰ μƒνƒœλ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 μ€„μ—λŠ” μŠ€μœ„μΉ˜ κ°œμˆ˜κ°€ 주어진닀. μŠ€μœ„μΉ˜ κ°œμˆ˜λŠ” 100 μ΄ν•˜μΈ μ–‘μ˜ μ •μˆ˜μ΄λ‹€. λ‘˜μ§Έ μ€„μ—λŠ” 각 μŠ€μœ„μΉ˜μ˜ μƒνƒœκ°€ 주어진닀. 켜져 있으면 1, 꺼져있으면 0이라고 ν‘œμ‹œν•˜κ³  사이에 빈칸이 ν•˜λ‚˜μ”© μžˆλ‹€. μ…‹μ§Έ μ€„μ—λŠ” ν•™μƒμˆ˜κ°€ 주어진닀. ν•™μƒμˆ˜λŠ” 100 μ΄ν•˜μΈ μ–‘μ˜ μ •μˆ˜μ΄λ‹€. λ„·μ§Έ 쀄뢀터 λ§ˆμ§€λ§‰ μ€„κΉŒμ§€ ν•œ 쀄에 ν•œ ν•™μƒμ˜ 성별, 학생이 받은 μˆ˜κ°€ 주어진닀. 남학생은 1둜, 여학생은 2둜 ν‘œμ‹œν•˜κ³ , 학생이 받은 μˆ˜λŠ” μŠ€μœ„μΉ˜ 개수 μ΄ν•˜μΈ μ–‘μ˜ μ •μˆ˜μ΄λ‹€. ν•™μƒμ˜ 성별과 받은 수 사이에 빈칸이 ν•˜λ‚˜μ”© μžˆλ‹€.

좜λ ₯

μŠ€μœ„μΉ˜μ˜ μƒνƒœλ₯Ό 1번 μŠ€μœ„μΉ˜μ—μ„œ μ‹œμž‘ν•˜μ—¬ λ§ˆμ§€λ§‰ μŠ€μœ„μΉ˜κΉŒμ§€ ν•œ 쀄에 20κ°œμ”© 좜λ ₯ν•œλ‹€. 예λ₯Ό λ“€μ–΄ 21번 μŠ€μœ„μΉ˜κ°€ μžˆλ‹€λ©΄ 이 μŠ€μœ„μΉ˜μ˜ μƒνƒœλŠ” λ‘˜μ§Έ 쀄 맨 μ•žμ— 좜λ ₯ν•œλ‹€. μΌœμ§„ μŠ€μœ„μΉ˜λŠ” 1, 꺼진 μŠ€μœ„μΉ˜λŠ” 0으둜 ν‘œμ‹œν•˜κ³ , μŠ€μœ„μΉ˜ μƒνƒœ 사이에 λΉˆμΉΈμ„ ν•˜λ‚˜μ”© λ‘”λ‹€.

 

풀이

// Authored by : seondal
// Co-authored by : -

// #include <bits/stdc++.h>
#include <iostream>
#include <vector>

using namespace std;

int n;
vector<int> swit;

void toggle(int index) {
    swit[index] = !swit[index];
    return;
}

void boy(int num) {
    for(int i=1; i<=n; i++)
        if(i%num == 0)
            toggle(i);
    return;
}

void girl(int num) {
    toggle(num);  // 쀑앙은 무쑰건 λ°”κΎΌλ‹€
    
    for(int i=1; true; i++) {
        int left = num-i;
        int right = num+i;
        
        if(left < 1 || right > n || swit[left] != swit[right])
            return;  // 인덱슀λ₯Ό λ„˜μ–΄μ„œκ±°λ‚˜ λŒ€μΉ­μ΄ μ•„λ‹ˆλΌλ©΄ μ’…λ£Œ
        
        toggle(left);
        toggle(right);
    }
}


void solution(int gender, int number) {
    if(gender==1)
        boy(number);
    else
        girl(number);
    
    return;
}

int main() {
    ios_base :: sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    
    // μž…λ ₯
    cin >> n;
    swit.assign(n+1, 0);
    for(int i=1; i<=n; i++)
        cin >> swit[i];
    
    // 풀이
    int m;
    cin >> m;
    while(m--) {
        int gender, number;
        cin >> gender >> number;
        solution(gender, number);
    }
    
    // 좜λ ₯
    for(int i=1; i<=n; i++) {
        cout << swit[i] << " ";
        
        if(i%20 == 0)
            cout << "\n";
    }
    
    return 0;
}

/*
 */
λ°˜μ‘ν˜•