
백준 문제집 PS
ses0028님의 "IT기업 및 대기업 계열사 코테보면서 비슷했던 문제들(지속적으로 업데이트 중)"
이번 방학 2달동안 골드 3 (81문제)까지 다 푸는 것이 목표입니다.
25.01.14 - 실버 4 1문제
⛳ (18/81문제)
문제 문제 제목 문제 티어 문제 링크 1244 스위치 켜고 끄기 실버 4 https://www.acmicpc.net/problem/1244

1년
1시간

실버 4


남자, 여자가 받는 수 N에 따라 다르게 처리한다.
남자(1) N
N의 배수 위치에 있는 수를 반전한다.
여자(2) N
N의 위치를 기준으로 양 옆의 스위치 상태가 같다면 두 스위치의 상태를 반전한다. 그리고 양 옆의 스위치가 반전인 상태가 그 양옆에서도 계속된다면 반전시킨다. 따라서, N을 기준으로 양옆의 상태가 같을때까지 나아가서 반전해준다.
switch = int(input())
state = list(map(int, input().split()))
n = int(input())
for _ in range(n):
info = list(map(int, input().split()))
mul = info[1] - 1
if info[0] == 1: # 남자
while mul <= switch-1:
state[mul] = 0 if state[mul] == 1 else 1
mul += (mul+1)
else: # 여자
start, end = mul-1, mul+1
state[mul] = 0 if state[mul] == 1 else 1
while 0 <= start and end <= switch-1:
if state[start] == state[end]:
if state[start] == 0:
state[start], state[end] = 1, 1
else:
state[start], state[end] = 0, 0
start -= 1; end += 1
else:
break
for i in range(0, switch, 20):
print(*state[i:i + 20])
switch: 스위치의 개수
state: 스위치의 상태들을 입력받을 list
n: 학생 수
info: 학생의 성별, 받은 수를 저장하는 list
mul: 학생이 받은 수 - 1 (인덱스로 처리하기 위함)
start: 학생이 받은 수를 기준으로 바로 앞의 인덱스
end: 학생이 받은 수를 기준으로 바로 뒤의 인덱스
1년 전, 비교적 간단하게 풀었었는데 계속 틀렸습니다가 떠서 포기했던 문제이다. 모든 반례들도 다 통과하는데 뭐가 문제일까 싶었었는데.. 문제를 다시 읽어보니

예... 이것 때문에 1년동안 썩어있던 문제네요.. 그래도 해결해서 다행입니다^^ 문제를 제대로 읽어야겠습니다 정말로
while state:
if len(state[:20]) == 20:
for a in state[:20]:
print(a, end=" ")
del state[:20]
else:
cnt = len(state)
for a in state[:20]:
print(a, end=" ")
del(state[:cnt])
틀렸던 코드에서는 다음과 같이 작성했더라구요. 문제를 읽고 그 로직을 구현했는데 테스트케이스로 확인을 안해봐서 어디서 문제가 있던지 몰랐던... 참고로 위의 코드에서 end=" "로 구현해서 줄바꿈이 되지 않습니다..ㅎ
state = [1, 0, 1, 0]
print(*state)
// 출력
1 0 1 0
리스트나 튜플의 각 요소를 개별적인 인수로 한 칸씩 띄어 출력해주는 연산자이다. 유용하게 사용할 수 있으므로 잘 알아두자.