KEEP GOING

[python] 백준 1244번 : 스위치 켜고 끄기 본문

code review/greedy

[python] 백준 1244번 : 스위치 켜고 끄기

jmHan 2022. 1. 22. 03:02
반응형

https://www.acmicpc.net/submit/1244/37936486

 

로그인

 

www.acmicpc.net

 

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번에서 제시한 코드이다.  

반응형
Comments