미소를뿌리는감자의 코딩

[백준 2024/02/20] 1244번 스위치 켜고 끄기 본문

코딩 테스트/백준

[백준 2024/02/20] 1244번 스위치 켜고 끄기

미뿌감 2024. 2. 20. 22:18
728x90

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

 

1244번: 스위치 켜고 끄기

첫째 줄에는 스위치 개수가 주어진다. 스위치 개수는 100 이하인 양의 정수이다. 둘째 줄에는 각 스위치의 상태가 주어진다. 켜져 있으면 1, 꺼져있으면 0이라고 표시하고 사이에 빈칸이 하나씩

www.acmicpc.net

 

1. 접근 방법

- male : 해당 수의 배수에 대해서 스위치를 키거나 끔

- female : 특정 스위치에 대해서 대칭일 때까지 스위치를 누름

 

male의 경우 직관적으로 접근해주면 되며, female의 경우 2개의 pointer (l, r 변수)를 이용해서 하나씩 넓혀나간다. 만약 값이 같다면 스위치를 바꾸어주고, 다르다면 while 문을 탈출해주면 된다.

 

2. 코드

def male(n):
    i = 2
    n_mul = n
    while n_mul <= num_range:
        light_status[n_mul] = 1 if light_status[n_mul] == 0 else 0
        n_mul = n * i
        i += 1
    return

def female(n):
    l = n
    r = n
    light_status[n] = 1 if light_status[n] == 0 else 0

    while l > 0 and r <= num_range and light_status[l] == light_status[r]:
        light_status[l] = 1 if light_status[l] == 0 else 0
        light_status[r] = 1 if light_status[r] == 0 else 0

        l -= 1
        r += 1

    return

def print_light():
    light_status.pop(0)

    for i, value in enumerate(light_status, 1):
        print(value, end=' ')
        if i % 20 == 0:
            print()


if __name__ == '__main__':
    num_range = int(input())
    light_status = list(map(int, input().split()))

    light_status.insert(0, -1)

    for _ in range(int(input())):
        sex, num = map(int,  input().split())

        if sex == 1:
            male(num)

        else:
            female(num)

    print_light()
728x90