https://www.acmicpc.net/problem/1244
뭔가... 깔끔하게 짠 코드는 아닌것 같아서 포스팅하기 제법 부끄럽지만...
일단 이 문제는
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()
'파이썬 알고리즘' 카테고리의 다른 글
[파이썬] 백준 2309 일곱 난쟁이 풀이 2가지 (1) | 2022.09.30 |
---|---|
[파이썬] 백준 13300 방배정 풀이 (1) | 2022.09.25 |
백준 10157 자리배정 파이썬 풀이 (1) | 2022.09.23 |
백준 2628 종이자르기 파이썬 풀이 (0) | 2022.09.22 |
SWEA 1979 어디에 단어가 들어갈 수 있을까 파이썬 풀이 (0) | 2022.09.22 |