문제
1부터 연속적으로 번호가 붙어있는 스위치들이 있다. 스위치에서 1은 켜져있고 0은 꺼져 있음을 나타낸다.
학생들에게 1이상이고 스위치 개수 이하인 자연수를 하나씩 나누어준다.
학생들은 자신의 성별과 받은 수에 따라 스위치를 조작한다.
남학생은 자신이 받은 수의 배수에 있는 스위치의 상태를 바꾼다.
여학생은 자신이 받은 수를 중심으로 좌우 대칭인 곳까지의 스위치 상태를 바꾼다.
학생들이 스위치를 조작했을 때 스위치들의 마지막 상태를 출력하라.
입력
첫째 줄에 100이하인 스위치의 개수가 주어진다.
둘째 줄에는 스위치의 상태가 주어진다.
셋째 줄에는 학생수가 100이하로 주어진다.
이후부터 학생의 성별과 학생이 받은수가 주어진다.
남학생은 1, 여학생은 2로 표시한다.
출력
마지막 스위치의 상태를 출력하며 한 줄에 20개씩 출력한다.
접근
시뮬레이션문제 -> 문제에서 주어진 조건을 그대로 구현하였다.
구현
스위치의 개수, 상태와 학생의 수를 입력받는다.
N = int(input())
switch = list(map(int, input().split()))
M = int(input()) # 학생 수
M명의 학생에게 정수를 나눠준다.
먼저 남자일 때는 부여받은 번호의 배수에 해당되는 스위치의 상태를 변경해주었다.
for _ in range(M):
s, n = map(int, input().split())
if s == 1:
for i in range(n-1, N, n):
if switch[i]:
switch[i] = 0
else:
switch[i] = 1
여자일 때는 left와 right를 받은 번호로 초기에 설정한다.
그래서 while문 안에서 left와 right에 해당되는 스위치의 상태가 같다면 상태를 변경해준다.
하지만 left와 right가 다르다면 종료한다.
left와 right가 같아서 상태를 변경할 때마다 left는 1씩 감속 right는 1씩 증가시킨다.
else:
n -= 1
left = right = n
while left >= 0 and right < N:
if switch[left] == switch[right]:
if switch[left]:
switch[left] = 0
switch[right] = 0
else:
switch[left] = 1
switch[right] = 1
else:
break
N이 20 이하일 때는 그대로 출력을 하며 N이 20을 초과할 때는 20개씩 출력하도록 하였다.
if N <= 20:
print(*switch)
else:
for i in range(len(switch)):
print(switch[i], end=" ")
if i+1 >= 20 and (i+1)%20 == 0:
print()
전체 코드
N = int(input())
switch = list(map(int, input().split()))
M = int(input()) # 학생 수
for _ in range(M):
s, n = map(int, input().split())
if s == 1:
for i in range(n-1, N, n):
if switch[i]:
switch[i] = 0
else:
switch[i] = 1
else:
n -= 1
left = right = n
while left >= 0 and right < N:
if switch[left] == switch[right]:
if switch[left]:
switch[left] = 0
switch[right] = 0
else:
switch[left] = 1
switch[right] = 1
else:
break
left -= 1
right += 1
if N <= 20:
print(*switch)
else:
for i in range(len(switch)):
print(switch[i], end=" ")
if i+1 >= 20 and (i+1)%20 == 0:
print()
'알고리즘 풀이 > 백준' 카테고리의 다른 글
[백준 17144] 미세먼지 안녕! (0) | 2021.02.25 |
---|---|
[백준 2947] 나무 조각 (0) | 2021.02.24 |
[백준 2407] 조합 (0) | 2021.02.23 |
[백준 15654] N과 M (5) (0) | 2021.02.23 |
[백준 15650] N과 M(2) (0) | 2021.02.23 |