백준 1244 스위치 켜고 끄기 (파이썬)

shon4bw·2021년 8월 17일
0

🧐1일 1알

목록 보기
7/24
post-thumbnail

내 풀이

T = int(input())
light = list(map(int, input().split()))
students = int(input())
for _ in range(students) : 
    gender, number = map(int,input().split())

    # 남학생 - 스위치 idx에서 number의 배수인 것들의 상태를 바꿔
    if gender == 1 :
        #스위치 번호 중에서 number(3)의 배수인 것을 찾아
        idx_n_m = []
        for i in range(1, len(light)+ 1): # 1 2 ... 8
            if i % number == 0 :
                idx_n_m.append(i)   #[3,6]
        
        # 그 인덱스들의 상태를 바꿔줘 
        for idx in idx_n_m : # 3, 6 
            if light[idx-1] == 0 :
                light[idx-1] = 1
            else :
                light[idx-1] = 0          # [0, 1, 1, 1, 0, 1, 0, 1]

    # <여학생 - 자기가 받은 수와 같은 번호가 붙은 스위치의 좌우 대칭 확인>
    # 같아? 그 범위 내에 있는 모든 수를 바꿔 자기 번호까지
    # 달라? 자기 번호만 바꿔
  
    # 어쨌든 자기 번호는 바뀜
    else :     
        g_idx= number-1  # 자기가 받은 수의 스위치 인덱스
        if light[g_idx] == 1 :
            light[g_idx] = 0
        else :
            light[g_idx] = 1

        # 좌우 확인
        scope = 1 
        while True:
            if 0 <= g_idx - scope and g_idx + scope <= len(light)-1 and light[g_idx - scope] == light[g_idx + scope]:
                if light[g_idx - scope] == 1:
                    light[g_idx - scope] = light[g_idx + scope] = 0
                else :
                    light[g_idx - scope] = light[g_idx + scope] = 1
                scope += 1
            else :
                break   

# 한 줄에 20개씩, 21부턴 아래에
# 일단 스위치 개수 받고, 20의 배수니?
for t in range(T) :  # 0,1,2,3...7 인덱스
    print(light[t], end=' ')
    if (t+1) % 20 == 0:    # 스위치 숫자
        print()

아쉬웠던 점 📝

사실 여학생 조건에서 #어쨌든 자기 번호는 바뀜부터 #좌우 확인을 한꺼번에 처리할 수 있었다.
scope=0으로 주면, 자기 번호에 대한 조건을 따로 생각하지 않아도 된다!

profile
cut_the_mustard

0개의 댓글