링크 : https://www.acmicpc.net/problem/1244
1244번: 스위치 켜고 끄기
첫째 줄에는 스위치 개수가 주어진다. 스위치 개수는 100 이하인 양의 정수이다. 둘째 줄에는 각 스위치의 상태가 주어진다. 켜져 있으면 1, 꺼져있으면 0이라고 표시하고 사이에 빈칸이 하나씩
www.acmicpc.net
- 문제
- 소요시간: 시간 많이 초과



- 설계하기(접근방법)
1. 스위치 개수, 스위치 상태, 입력 횟수, 성별과 번호를 입력받는다
2. 문제 해석
입력 1: 남성의 경우
-> 해당 번호의 배수의 스위치를 invert한다. ex) 3이 입력으로 들어오면 3번째(인덱스 넘버 2), 6번째(인덱스 넘버 5) 를 invert
입력 2: 여성의 경우 (까다로웠다)
-> 먼저 해당 번호를 기준으로 좌우 1칸씩 늘려나가면서, 그 양쪽 칸의 상태가 같다면 invert 해준다
먼저 해당 번호(가운데) 를 invert 해준다.
while문을 선언하고 종료 조건 : 인덱스의 범위를 벗어나는 경우 즉 (num - j >= 1 and num + j <= n)이다.
if j칸 왼쪽으로 간 스위치와 j칸 오른쪽으로 간 스위치가 같다면(0,0 or 1,1) invert해준다.
그렇지 않다면 break
while문 내에서 j를 1씩 증가시키면서 좌우로 한칸씩 인덱스를 옮긴다.
인덱스 범위를 초과하면 조건으로 자동 종료된다.
3. invert 구현
array와 num(문제에서 제시한 번호)를 인자로 넘긴다
문제의 num과 실제 index번호는 1 차이가 있으니 -1을 해준다.
1인 경우 0으로
0인 경우 1로 invert한다.
4. 출력 구현
20번째 숫자마다 '\n\를 진행해주어야 하니
for문을 통해 한 줄에 20개씩 출력하도록 한다.
- 코드(출력)
n = int(input())
def switch_invert(array, num):
if array[num-1] == 1:
array[num-1] = 0
else:
array[num-1] = 1
switch = list(map(int, input().split()))
p = int(input())
for i in range(p):
s, num = map(int, input().split())
if s == 1:
k = num
while (k <= n):
switch_invert(switch, k)
k += num
if s == 2:
j = 0
switch_invert(switch, num)
j += 1
while (num - j >= 1 and num + j <= n):
if switch[num + j-1] == switch[num - j-1]:
switch_invert(switch, num + j)
switch_invert(switch, num - j)
else:
break
j += 1
for i in range(0, len(switch)):
if (i+1) % 20 == 0:
print(switch[i])
else:
print(switch[i], end=' ')
- 얻어갈 부분
1. 구현 문제를 풀 때는 문제의 조건과 지문을 정확하게 읽은 후 풀자
2. 인덱스의 범위를 지정하기 까다로울 때는 예시를 통해서 지정하고 꼼꼼히 체크하자. 절대 디버깅으로 풀지 말자. 시간이 오래걸린다.
'알고리즘(백준) > 구현' 카테고리의 다른 글
| [알고리즘/구현] 1913번 : 달팽이 - python (0) | 2023.04.16 |
|---|---|
| [알고리즘/구현] 20436번 : ZOAC 3 - python (1) | 2023.04.14 |
| [알고리즘/구현] 4396번 : 지뢰 찾기 - python (0) | 2023.03.20 |
| [알고리즘/구현] 2578번 : 빙고 - python (0) | 2023.02.28 |
| [알고리즘/구현] 1924 번 : 2007년 - python (0) | 2023.02.27 |