꿈꾸는 개발자의 devLog
[BaekJoon] "구현" - 백준 1244번 문제 : 스위치 켜고 끄기 본문
[문제 설명]
https://www.acmicpc.net/problem/1244
1244번: 스위치 켜고 끄기
첫째 줄에는 스위치 개수가 주어진다. 스위치 개수는 100 이하인 양의 정수이다. 둘째 줄에는 각 스위치의 상태가 주어진다. 켜져 있으면 1, 꺼져있으면 0이라고 표시하고 사이에 빈칸이 하나씩
www.acmicpc.net
1부터 연속적으로 번호가 붙어있는 스위치들이 있음. 스위치는 켜져 있거나 꺼져 있는 상태
1 : 스위치 켜져 있음, 0 : 스위치 꺼져 있음
남학생은 스위치 번호가 자기가 받은 수의 배수이면, 그 스위치의 상태를 바꿈
켜져있으면 끄고, 꺼져 있으면 킴
여학생은 자기가 받은 수와 같은 번호가 붙은 스위치를 중심으로 좌우가 대칭이면서 가장 많은 스위치를 포함하는 구간을 찾아서, 그 구간에 속한 스위치의 상태를 모두 바꿈 ( 이때, 구간에 속한 스위치 개수는 항상 홀수가 됨)
[해결 로직]
- 일단, 남학생인 경우에는 자신이 선택한 수의 배수에 위치한 스위치들의 상태를 바꿔줌
- 여기서 비트연산으로 ^1 해주면 0에서 1로, 1에서 0으로 바뀜
- 그럼 여학생일 때는 자기가 선택한 스위치 먼저 상태 바꿔줌
- 그러고 나서 일단 처음 부터 끝까지 양 옆으로 탐색을 진행하는데
- 스위치 범위 내에 서로 값이 같다면 상태 바꿔줌. 그렇지 않으면 탐색 탈출
- 여기서 탈출 (else문을 설정하지 않으면)하지 않으면, 연속된 구간을 벗어나서 다시 또 값이 같은 범위를 찾기 때문에 무 조건 탈출문을 선언해줘야 함
- 이 부분 때문에 오류 발생하였음
[Solution 코드]
n = int(input())
ary = list(map(int, input().split()))
k = int(input())
stu_lst = []
for i in range(k):
in1, in2 = map(int, input().split())
stu_lst.append((in1, in2))
for i in range(k):
gen, swc = stu_lst[i][0], stu_lst[i][1]
if gen == 1: ## 남자일때
for x in range(n):
if (x + 1) % swc == 0: ## 배수인것만 바꿈
ary[x] = ary[x] ^ 1
else: ## 여자일때
## 일단 처음과 끝이랑 비교해서 가장 가까운 수 구해서
## 비교 횟수 구하기
strt = swc - 1
ends = n - swc
difs = 0
difs = strt if strt <= ends else ends
#print(difs)
ary[strt] = ary[strt] ^ 1
for i in range(difs):
befx = (swc - 1) - (i + 1)
aftx = (swc - 1) + (i + 1)
#print(befx, aftx)
if (befx >= 0 and aftx < n): ## 스위치 범위 내
if ary[befx] == ary[aftx]: # 서로 값이 같다면
ary[befx] = ary[befx] ^ 1
ary[aftx] = ary[aftx] ^ 1
else:
break
else:
break
for idx, value in enumerate(ary):
print(value, end = " ")
if (idx + 1) % 20 == 0:
print()
'Algorithm > BaekJoon' 카테고리의 다른 글
[BaekJoon] "DFS/BFS" - 백준 16234번 문제 : 인구 이동 (1) | 2024.01.18 |
---|---|
[BaekJoon] "DFS/BFS" - 백준 14940번 문제 : 쉬운 최단 거리 (1) | 2024.01.18 |
[BaekJoon] "DFS/BFS" - 백준 3187번 문제 : 양치기 꿍 (0) | 2024.01.18 |
[BaekJoon] "그리디" - 백준 20300번 문제 : 서강근육맨 (0) | 2024.01.17 |
[BaekJoon] "DFS/BFS" - 백준 16918번 문제 : 봄버맨 (0) | 2024.01.17 |