본문 바로가기

Algorithm/Baekjoon BOJ

[백준][파이썬] 1244번 : 스위치 켜고 끄기(코드, 해설, 풀이)

반응형

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

 

1244번: 스위치 켜고 끄기

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

www.acmicpc.net


- 문제

 

  스위치의 상태가 입력으로 주어지고 각 학생의 성별과 받은 수가 주어지면 성별과 받은 수를 이용해서 스위치를 끄고 킨 후에 결과를 출력하는 문제이다.

 

성별이 남자인 경우

: 받은 수의 배수에 해당하는 모든 스위치를 현재 상태의 반대로 만든다. (꺼져있으며 키고, 켜져있으면 끈다)

 

성별이 여자인 경우

: 받은 수를 중심으로 좌우가 서로 다른 상태일때까지 모든 스위치를 반대로 만든다.

ex) 스위치의 상태 : [1 1 1 1 0]이고 주어진 수는 3이면 2번째와 4번째가 같은 상태이므로 반대로 만들고, 그 이후에 1번째랑 5번째가 다른 상태이므로 여기서 끝낸다.

 

출력) [1 0 0 0 0]이 된다.

 


- 해설

 

  학생이 여러명이 있더라도 순서대로 한명 씩 스위치의 On/Off를 진행하면 되기 때문에 학생의 성별만 신경쓰면 된다. 

 

1. 학생이 남성일 때

: 주어진 수의 배수에 해당하는 스위치를 모두 반대로 만들면 되므로 간단하게 해결할 수 있다.

 

2. 학생이 여성일 때

: 받은 스위치의 번호를 기준으로 -i와 +i를 비교하여 같으면 스위치의 상태를 반대로 만들어주면 된다.

 

 


- 풀이

import sys
countSwitch = int(sys.stdin.readline())
switches = list(sys.stdin.readline().split())
students = int(sys.stdin.readline())
for _ in range(students):
    studentState = (list(map(int, sys.stdin.readline().split())))
    now = studentState[1]
    if studentState[0] == 1:
        for i in range(now-1, countSwitch, now):
            if switches[i] == '1':
                switches[i] = '0'
            else:
                switches[i] = '1'
    else:
        i = 0
        while(now-i-1 >= 0 and now+i-1 < countSwitch):
            if switches[now-i-1] == switches[now+i-1]:
                if switches[now-i-1] == '1':
                    switches[now-i-1] = '0'
                    switches[now+i-1] = '0'
                else:
                    switches[now-i-1] = '1'
                    switches[now+i-1] = '1'
                i += 1
            else:
                break
count = 0
for switch in switches:
    if(count % 20 == 0 and count != 0):
        print()
    print(int(switch), end=" ")
    count += 1

 

  해설 그대로 만든것이기 때문에 딱히 설명할 만한 것이 없다. 신경써야 하는 부분으로는 now-i-1와 같이 리스트의 인덱스를 직접 지정하여 사용하기 때문에 인덱스 범위 에러가 발생하지 않도록 조심스럽게 코드를 짜야 한다.

반응형