파이썬 알고리즘

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

뜻 지, 깨달음 오 2022. 9. 24. 23:58

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

 

1244번: 스위치 켜고 끄기

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

www.acmicpc.net

뭔가... 깔끔하게 짠 코드는 아닌것 같아서 포스팅하기 제법 부끄럽지만...

 

일단 이 문제는 

1) 스위치를 바꾸는 사람이 남자인지 여자인지 판별하기

2) 불을 키거나 끌 스위치 결정하기

3) 불을 키거나 끄게 바꾸기 (0, 1 바꾸기)

요 3개를 해야하는 문제이다.

 

그중에 3번은 계속 일단 2번이 결정되기만 하면 계속 반복되기 때문에 

def switch_light(k):
    global switches
    if switches[k]==0:
        switches[k]=1
    elif switches[k]==1:
        switches[k]=0

이렇게 함수에 넣어서 0이면 1로, 1이면 0으로 바꿔줬다.

 

이제 1번이랑 2번을 해야하는데

일단 스위치에 0번 인덱스가 없으니까 사고하기가 어려워서

switch의 0번 자리에 0을 넣어줬다.

이제 내가 원하는 자리에 스위치가 다 들어갔다.

나중에 출력할때 0번 인덱스 무시하는거 잊지말기

switch_number = int(input())
switches = list(map(int, input().split()))
switches.insert(0, 0)
student_number = int(input())
student_trial = [list(map(int, input().split())) for _ in range(student_number)]

 

이제

남자라면, 

스위치 전체를 돌면서 해당 자리의 인덱스가 남자 번호로 나눠지는지 확인해야한다.

for i in range(student_number):
    if student_trial[i][0]==1: #남자라면
        for j in range(len(switches)):
            if j%student_trial[i][1]==0: #j가 주어진 값으로 나눠진다면
                switch_light(j) # 스위치 바꾸기
                continue #다음으로 바꿀 스위치 또 찾기
            else: continue

여자라면 좀 더 복잡한데,

주어진 숫자와 대칭으로 같은 스위치인지 확인을 해야한다.

일단 최대로 돌 수 있는 수가 스위치 길이//2이니까 범위를 그렇게 잡아주고,

범위를 넘어가면 인덱스 에러가 생기니까 범위 벗어나면 break를 시켜준다.

이제 대칭이면 스위치를 키거나 꺼주는데,

대칭 아닌거를 만나자마자 break를 걸어줘야한다.

 

    elif student_trial[i][0]==2: #여자라면
        for j in range(switch_number//2):
            if student_trial[i][1]+j>switch_number or student_trial[i][1]-j<1: break
            if j==0:
                switch_light(student_trial[i][1])
                continue
            elif switches[student_trial[i][1]-j] == switches[student_trial[i][1]+j]:
                switch_light(student_trial[i][1]-j)
                switch_light(student_trial[i][1]+j)
                continue
            else: break

 

이제 출력을 해야하는데

문제에 한줄에 20개까지 출력이라고 써있다.

그리고 아까 0번 인덱스는 무시하기로 했으니까

for i in range(1, len(switches)):
    print(switches[i], end= ' ')
    if i % 20 == 0 :
        print()

 

 

전체 풀이)

switch_number = int(input())
switches = list(map(int, input().split()))
switches.insert(0, 0)
student_number = int(input())
student_trial = [list(map(int, input().split())) for _ in range(student_number)]

def switch_light(k):
    global switches
    if switches[k]==0:
        switches[k]=1
    elif switches[k]==1:
        switches[k]=0


for i in range(student_number):
    if student_trial[i][0]==1: #남자라면
        for j in range(len(switches)):
            if j%student_trial[i][1]==0: #j가 주어진 값으로 나눠진다면
                switch_light(j) # 스위치 바꾸기
                continue #다음으로 바꿀 스위치 또 찾기
            else: continue

    elif student_trial[i][0]==2: #여자라면
        for j in range(switch_number//2):
            if student_trial[i][1]+j>switch_number or student_trial[i][1]-j<1: break
            if j==0:
                switch_light(student_trial[i][1])
                continue
            elif switches[student_trial[i][1]-j] == switches[student_trial[i][1]+j]:
                switch_light(student_trial[i][1]-j)
                switch_light(student_trial[i][1]+j)
                continue
            else: break

for i in range(1, len(switches)):
    print(switches[i], end= ' ')
    if i % 20 == 0 :
        print()