Post
스위치 켜고 끄기(백준 1244번) | Gihun Son

스위치 켜고 끄기(백준 1244번)

💡 **Check Point !

( 해당사항 ✓체크 )

  1. 막힘 없이 수월하게 풀린 문제인가? ✓

  2. 1시간이내로 풀렸던 문제인가?

  3. 1시간 이상 or 며칠을 두고 풀어봤더니 풀린 문제인가?

  4. 시간을 써도 도무지 풀 수 없는 문제인가?

  5. 솔루션을 찾아봤는가?


난이도 체감

  1. 최상

  2. 하✓


이해도

  1. 완벽히 이해✓

  2. 다소 헷갈리는 부분들이 있음

  3. 이해 못함

문제

1부터 연속적으로 번호가 붙어있는 스위치들이 있다. 스위치는 켜져 있거나 꺼져있는 상태이다. <그림 1>에 스위치 8개의 상태가 표시되어 있다. ‘1’은 스위치가 켜져 있음을, ‘0’은 꺼져 있음을 나타낸다. 그리고 학생 몇 명을 뽑아서, 학생들에게 1 이상이고 스위치 개수 이하인 자연수를 하나씩 나누어주었다. 학생들은 자신의 성별과 받은 수에 따라 아래와 같은 방식으로 스위치를 조작하게 된다.

남학생은 스위치 번호가 자기가 받은 수의 배수이면, 그 스위치의 상태를 바꾼다. 즉, 스위치가 켜져 있으면 끄고, 꺼져 있으면 켠다. <그림 1>과 같은 상태에서 남학생이 3을 받았다면, 이 학생은 <그림 2>와 같이 3번, 6번 스위치의 상태를 바꾼다.

여학생은 자기가 받은 수와 같은 번호가 붙은 스위치를 중심으로 좌우가 대칭이면서 가장 많은 스위치를 포함하는 구간을 찾아서, 그 구간에 속한 스위치의 상태를 모두 바꾼다. 이때 구간에 속한 스위치 개수는 항상 홀수가 된다.

스위치 번호
스위치 상태01010001

<그림 1>

예를 들어 <그림 2>에서 여학생이 3을 받았다면, 3번 스위치를 중심으로 2번, 4번 스위치의 상태가 같고 1번, 5번 스위치의 상태가 같으므로, <그림 3>과 같이 1번부터 5번까지 스위치의 상태를 모두 바꾼다. 만약 <그림 2>에서 여학생이 4를 받았다면, 3번, 5번 스위치의 상태가 서로 다르므로 4번 스위치의 상태만 바꾼다.

스위치 번호
스위치 상태01110101

<그림 2>

스위치 번호
스위치 상태10001101

<그림 3>

입력으로 스위치들의 처음 상태가 주어지고, 각 학생의 성별과 받은 수가 주어진다. 학생들은 입력되는 순서대로 자기의 성별과 받은 수에 따라 스위치의 상태를 바꾸었을 때, 스위치들의 마지막 상태를 출력하는 프로그램을 작성하시오.

Untitled

나의 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
N=int(input())
switch_list=list(map(int,input().split()))
student_num=int(input())
for _ in range(student_num):
    s,num=map(int,input().split())
    if s==1:
        n=num
        while num<=N:
            if switch_list[num-1]:
                switch_list[num-1]=0
            else:
                switch_list[num-1]=1
            num+=n
    else:
        if switch_list[num-1]:
            switch_list[num-1]=0
        else:
            switch_list[num-1]=1
        l=num-1
        r=num+1
        while l>0 and r<N+1:
            if switch_list[l-1]==switch_list[r-1]:
                if switch_list[l-1]:
                    switch_list[l-1]=0
                    switch_list[r-1]=0
                else:
                    switch_list[l-1]=1
                    switch_list[r-1]=1
                l-=1
                r+=1
            else:
                break
for s_i in range(len(switch_list)):
    print(switch_list[s_i],end=' ')
    if s_i!=0 and (s_i+1)%20==0:
        print('')
  • 문제 조건에 맞게 각 조건문을 추가해주었다.
  • 내가 못봤던 조건은 스위치는 한 줄에 20개씩 출력된다는 것이었다. 이를 제외하면 문제 없이 풀 수 있었다.
This post is licensed under CC BY 4.0 by the author.