KEEP GOING
[python] 백준 1244번 : 스위치 켜고 끄기 본문
반응형
https://www.acmicpc.net/submit/1244/37936486
0. 정답인 코드
n = int(input())
# idx 값 맞추기 위해 0번에 미지값 추가
bulbs = [-1] + list(map(int, input().split()))
k = int(input())
students = [tuple(map(int, input().split())) for _ in range(k)]
for sex, num in students:
# 성별이 남자일때
if sex == 1:
for i in range(num, n+1, num):
bulbs[i] = 1 - bulbs[i]
# 성별이 여자일때
else:
bulbs[num] = 1 - bulbs[num]
for k in range(n//2):
if num + k > n or num - k < 1: break
if bulbs[num+k] == bulbs[num-k]:
bulbs[num+k] = 1 - bulbs[num+k]
bulbs[num-k] = 1 - bulbs[num-k]
else:
break
for i in range(1, n+1):
print(bulbs[i], end=' ')
if i % 20 == 0:
print()
1. 구현하였으나 정답이 아니었던 코드
n = int(input())
bulbs = list(map(int, input().split()))
k = int(input())
students = [tuple(map(int, input().split())) for _ in range(k)]
for sex, num in students:
if sex == 1:
for i in range(n):
if (i+1) % num == 0:
bulbs[i] = 1 - bulbs[i]
else:
num -= 1
start, end = num, num
while start >= 0 and end < n:
if bulbs[start] == bulbs[end]:
start -= 1
end += 1
else: break
start += 1
end -= 1
for i in range(start, end+1):
bulbs[i] = 1 - bulbs[i]
for i in range(n):
print(bulbs[i], end=' ')
if i!=0 and i%19 == 0:
print()
이 문제를 틀린 이유는 인덱스 범위를 잘못 계산해서였다. 0번째 인덱스의 위치를 문제에서는 1번째로 나타내고 있다. 스위치를 1~ 20번까지 출력하고 21번째부터는 다음줄에서 출력하도록 요구하고 있다. 여기서 구현된 코드에 의하면 0~19, 20~39, 40~59 인덱스 순으로 스위치가 정렬되는데 이렇게 되면 39, 59는 19의 배수가 아니므로 잘못 출력되게 된다. 이 문제를 해결하기 위해서 스위치 상태를 담는 bulbs에서 입력과 동시에 0번째 인덱스에 잉여값을 추가하여 인덱스 번호를 맞춰추면 된다.
2. 정답인 코드
n = int(input())
# 0번째 위치에 잉여값 추가
bulbs = [-1] + list(map(int, input().split()))
k = int(input())
students = [tuple(map(int, input().split())) for _ in range(k)]
for sex, num in students:
# 남자인 경우
if sex == 1:
for i in range(1, n+1):
if i % num == 0:
bulbs[i] = 1 - bulbs[i]
# 여자인 경우
else:
start, end = num, num
while start >= 1 and end <= n:
if bulbs[start] == bulbs[end]:
start -= 1
end += 1
else: break
start += 1
end -= 1
for i in range(start, end+1):
bulbs[i] = 1 - bulbs[i]
# 출력
for i in range(1, n+1):
print(bulbs[i], end=' ')
if i % 20 == 0:
print()
따라서 다음과 같이 스위치의 상태를 받을 때 0번째 인덱스에 값을 추가하여 문제에서 언급하는 i번째 스위치 위치와 i번째 인덱스를 맞춰주더니 정답 코드로 인정됐다. 여기서 추가적으로 코드를 개선해본 코드가 0번에서 제시한 코드이다.
반응형
'code review > greedy' 카테고리의 다른 글
[python] 백준 15486 번 : 퇴사2 (0) | 2022.01.26 |
---|---|
[python] 백준 17086번 : 아기상어2 (0) | 2022.01.23 |
[python] 백준 2138번 : 전구와 스위치 (0) | 2022.01.21 |
[python] 백준 2885번 : 초콜릿 식사 (0) | 2022.01.20 |
[python] 백준 1191번 : 흙길 보수하기 (0) | 2022.01.19 |
Comments