[1244] 스위치 켜고 끄기

HeeSeong·2021년 2월 3일
0

백준

목록 보기
2/79
post-thumbnail

🔗 문제 링크

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


❔ 문제 설명


1부터 연속적으로 번호가 붙어있는 스위치들이 있다. 스위치는 켜져 있거나 꺼져있는 상태이다.


<그림 1>
			스위치 번호 : 1 2 3 4 5 6 7 8
			스위치 상태 : 0 1 0 1 0 0 0 1

<그림 1>에 스위치 8개의 상태가 표시되어 있다.
‘1’은 스위치가 켜져 있음을, ‘0’은 꺼져 있음을 나타낸다.

그리고 학생 몇 명을 뽑아서, 학생들에게 1 이상이고 스위치 개수 이하인 자연수를 하나씩 나누어주었다. 학생들은 자신의 성별과 받은 수에 따라 아래와 같은 방식으로 스위치를 조작하게 된다.

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


<그림 2>
			스위치 번호 : 1 2 3 4 5 6 7 8
			스위치 상태 : 0 1 1 1 0 1 0 1

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

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


<그림 3>
			스위치 번호 : 1 2 3 4 5 6 7 8
			스위치 상태 : 1 0 0 0 1 1 0 1

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


⚠️ 제한사항


입력

첫째 줄에는 스위치 개수가 주어진다. 스위치 개수는 100 이하인 양의 정수이다. 둘째 줄에는 각 스위치의 상태가 주어진다. 켜져 있으면 1, 꺼져있으면 0이라고 표시하고 사이에 빈칸이 하나씩 있다. 셋째 줄에는 학생수가 주어진다. 학생수는 100 이하인 양의 정수이다. 넷째 줄부터 마지막 줄까지 한 줄에 한 학생의 성별, 학생이 받은 수가 주어진다. 남학생은 1로, 여학생은 2로 표시하고, 학생이 받은 수는 스위치 개수 이하인 양의 정수이다. 학생의 성별과 받은 수 사이에 빈칸이 하나씩 있다.


출력

스위치의 상태를 1번 스위치에서 시작하여 마지막 스위치까지 한 줄에 20개씩 출력한다. 예를 들어 21번 스위치가 있다면 이 스위치의 상태는 둘째 줄 맨 앞에 출력한다. 켜진 스위치는 1, 꺼진 스위치는 0으로 표시하고, 스위치 상태 사이에 빈칸을 하나씩 둔다.



💡 풀이 (사용언어 : Python)


import sys

n = int(sys.stdin.readline().strip())
exlist = list(map(int, sys.stdin.readline().strip().split()))
mannum = int(sys.stdin.readline().strip())
manlist = []

for i in range(mannum):
    manlist.append(list(map(int, sys.stdin.readline().strip().split())))

for j in range(len(manlist)):
    # 남자 경우
    if manlist[j][0] == 1:
        for k in range(len(exlist)):
            if (k + 1) % manlist[j][1] == 0:
                if exlist[k] == 0:
                    exlist[k] = 1
                else:
                    exlist[k] = 0 

    # 다른 사람들 중 if로 0인지 아닌지 내가 여러줄로 구분한걸 한줄로 깔끔하게 만들어서 가져옴
    # exlist[k] = (exlist[k] + 1) % 2

    # 여자 경우
    elif manlist[j][0] == 2:
        # 인덱스 0부터 시작이라 1씩 빼준 인덱스 값 사용
        # while문으로 다른 쌍 찾을때까지 계속 반복, 인덱스 벗어나는 부분을 조건처리
        k = 0
        
        while (manlist[j][1] - k - 2 >= 0) and (manlist[j][1] + k < len(exlist)):
            if exlist[manlist[j][1] - k - 2] == exlist[manlist[j][1] + k]:
                if exlist[manlist[j][1] - k - 2] == 0:
                    exlist[manlist[j][1] - k - 2] = 1
                    exlist[manlist[j][1] + k] = 1
                else:
                    exlist[manlist[j][1] - k - 2] = 0
                    exlist[manlist[j][1] + k] = 0
                k += 1

            else:
                break
		
        # 양쪽 바꿔주는게 끝났으므로 처음 시작점 바꿔주고 마무리
        if exlist[manlist[j][1] - 1] == 0:
            exlist[manlist[j][1] - 1] = 1
        else:
            exlist[manlist[j][1] - 1] = 0

# 20의 배수번째 순서마다 한줄 띄어서 출력
for i in range(n):
    print(exlist[i], end = ' ')
    if (i % 19 == 0) and (i != 0):
        print()                   
profile
끊임없이 성장하고 싶은 개발자

0개의 댓글