자료구조 및 알고리즘/백준

[python] 1244. 스위치 켜고 끄기

viamemine 2024. 5. 29. 11:58
728x90
반응형

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

 

풀이

 

이번 문제는 남자인 경우는 쉽게 풀렸지만,

여자인 경우에서 자꾸 에러가 났습니다. 

 

이는 남자일 때는 해당 숫자의 배수를 뒤집으면 되는 문제이지만 (for문의 step을 num만큼)

여자일 때는 대칭인 경우와 비대칭인 경우를 고려해주어야 하기 때문입니다.

 

일단 문제는 인덱스가 1부터 시작하는데, 

배열은 인덱스가 0부터 시작하기 때문에

가장 앞에 [-1]을 추가해서 인덱스를 맞춰주었습니다.

 

핵심은 여자인 경우의 대칭과 비대칭일 때의 코드를 작성하는 것입니다. 

나는 처음에 cnt를 +1해주는 방식으로

i = i+2*cnt일 때와 i != i+2*cnt (일치/불일치)로 코드를 짰습니다.

 

그러나 index error 발생으로 코드를 리팩토링했습니다. 

 

문제는 다음과 같이 해결했습니다.

 

i의 범위를 range(n//2)로 하여

num+i와 num-i를 비교해주었습니다. 

 

또한 num + i > n 이거나  num - i < 1 일 때는 (index가 넘어가는 경우)

break를 걸어주어 index error가 나지 않도록 구현했습니다.

 


 

- 런타임 에러(index error) 코드

n = int(input())
switch_list = list(map(int, input().split()))
students = int(input())

def switch(idx, switch_list):
    if switch_list[idx] == 1:
        switch_list[idx] = 0
    else:
        switch_list[idx] = 1
    return

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

    if gender == 1: # 남자이면
        for i in range(num-1, n, num): # 배수이면 스위치 상태바꿈
            switch(i, switch_list)


    else: # 여자이면
        cnt = 1
        for i in range(num-2, -1, -1):
            if switch_list[i] != switch_list[i + 2 * cnt]:  # 대칭 아닐 때는 num값만 바꾸기
                cnt += 1
                break
            else: # 대칭일 때는 모두 바꾸기
                switch(i, switch_list)
                switch(i + 2 * cnt, switch_list)
                cnt += 1

        switch(num-1, switch_list)

print(*switch_list)

 

 

 

 

- 인덱스 처리해 준 리팩토링 코드 

n = int(input())
switch_list = [-1] + list(map(int, input().split()))
students = int(input())

def switch(idx):
    if switch_list[idx] == 1:
        switch_list[idx] = 0
    else:
        switch_list[idx] = 1
    return

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

    if gender == 1: # 남자이면
        for i in range(num, n+1, num): # 배수이면 스위치 상태바꿈
            switch(i)

    else: # 여자이면
        switch(num)
        for i in range(n//2): # 양쪽 탐색
            if num + i > n or num - i < 1 : break # index 넘어가면 break
            if switch_list[num-i] == switch_list[num+i]:  # 대칭일 때는 모두 바꾸기
                switch(num-i)
                switch(num+i)
            else:
                break

for i in range(1, n+1):
    print(switch_list[i], end=' ')
    if i % 20 == 0 : # 한줄에 20개씩 출력
            print()

 

 

화이팅 - ! 

728x90