반응형
https://www.acmicpc.net/problem/1244
- 문제
스위치의 상태가 입력으로 주어지고 각 학생의 성별과 받은 수가 주어지면 성별과 받은 수를 이용해서 스위치를 끄고 킨 후에 결과를 출력하는 문제이다.
성별이 남자인 경우
: 받은 수의 배수에 해당하는 모든 스위치를 현재 상태의 반대로 만든다. (꺼져있으며 키고, 켜져있으면 끈다)
성별이 여자인 경우
: 받은 수를 중심으로 좌우가 서로 다른 상태일때까지 모든 스위치를 반대로 만든다.
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와 같이 리스트의 인덱스를 직접 지정하여 사용하기 때문에 인덱스 범위 에러가 발생하지 않도록 조심스럽게 코드를 짜야 한다.
반응형
'Algorithm > Baekjoon BOJ' 카테고리의 다른 글
[백준][파이썬] 2435번 : 기상청 인턴 신현수(코드, 해설, 풀이) (0) | 2022.05.06 |
---|---|
[백준][파이썬] 1459번 : 걷기(코드, 해설, 풀이) (0) | 2022.05.06 |
[백준][파이썬] 1541번 : 잃어버린 괄호(코드, 해설, 풀이) (0) | 2022.05.06 |
[백준][파이썬] 1213번 : 팰린드롬 만들기(코드, 해설, 풀이) (0) | 2022.05.04 |
[백준][파이썬] 1614번 : 영식이의 손가락(코드, 해설, 풀이) (0) | 2022.05.02 |