https://www.acmicpc.net/problem/15729
문제를 풀면서 몰랐던 개념
(1) [Python] 일정구간 리스트 값을 한 번에 바꾸고 싶을 때
: 원소 하나만 바꿀 때는 해당 인덱스를 지정해서 바꾸면 되지만 구간을 정해서 여러 개를 한 번에 바꾸려고 할 때는 인덱스 슬라이싱을 이용하고 바꾸려고 하는 값 역시 해당 구간만큼(리스트 형식) 가지고 있어야 한다.
A = [0, 0, 0, 0, 0]
B = [1, 1, 1]
# 리스트 A에서 0번째에서 2번째까지 리스트 B의 값으로 바꾸고 싶을 때
A[0:2] = B
# 또는 #
A[0:2] = [1, 1, 1]
print(A)
>>> [1, 1, 1, 0, 0, 0]
(2) [Python] boolean
: 0과 1로 구성된 것이 나올 때는 0 -> 1, 1-> 0 이런식으로 바꾸려고만 생각하지 말고 True, False를 생각해서 'not' 연산자를 활용해보자.
(3) 인덱스 범위가 리스트를 벗어나지 않게 체크하는 방법
: 예를 들어서, '오른쪽으로 몇 칸까지 영향을 미친다.' 라는 조건이 제시되었을 경우에 무작정 변수 i에 +1,+2를 붙여서 반복문을 돌리게 되면 리스트 인덱스 값이 범위를 벗어났다는 에러는 마주하게 됨.
-> 이럴 때는 해당 인덱스(i+1, i+2 등)가 for문의 range(범위) N값 보다 작은지 체크해주고 이 안에서만 수행 가능하도록 해주기!
문제의 접근 방법
- 0과 1로 이루어져 있으므로, 구현하기 쉽게 True, False로 바꾸어서 진행하기
- 현재 모두 불이 꺼진 상태의 배열을 만들어서 쪽지 값과 비교하기
내가 막혔던 부분
- 불이 다 꺼져있는 상태의 배열을 하나 선언하여 쪽지 상태와 하나씩 비교를 해나가는 방법을 생각했다. 불이 꺼져있으면 켜고(오른쪽 두 개의 버튼까지), 켜져있으면 끄는 아이디어 밖에 떠올리지 못했다. 범위 설정이 잘못되었는지 계속 런타임 에러가 났다.
- boolean 개념을 사용을 하지 못함.
- 오른쪽으로 두 개의 버튼까지 영향을 미치는 부분을 구현하기 위해서 리스트가 인덱스 범위를 벗어나지 않는 선에서 어떻게 체크해야하는지 방법을 몰랐다.
오답 소스코드(처음에 내가 짠 것)
### 런타임 에러 ###
N = int(input()) # 버튼의 개수
num = list(map(int, input().split())) # 쪽지에 적혀있는 N자리의 수
current = [0] * N # 현재 불이 모두 꺼진 상태
cnt = 0
for i in range(N):
if num[i] != current[i]:
cnt += 1
for j in range(3):
if current[i+j] == 0:
current[i+j] = 1
else:
current[i+j] = 0
print(cnt)
정답 소스코드(힌트보고 내가 다시 짠 것)
N = int(input()) # 버튼의 개수
num = list(map(int, input().split())) # 쪽지에 적혀있는 N자리의 수
current = [0] * N # 현재 불이 다 꺼져있는 상태의 배열(0이니까 False)
cnt = 0 # 바꾸는 횟수를 누적해서 더할 변수
for i in range(N):
if num[i] != current[i]: # 두 값이 다르면
cnt += 1
current[i] = not current[i] # 바꿔주기(boolean 개념)
# 오른쪽으로 두칸까지 영향을 미치므로 체크해주기
# 체크 안하면 리스트 인덱스가 범위를 벗어나게 됨.
if i+1 < N:
current[i+1] = not current[i+1]
if i+2 < N:
current[i+2] = not current[i+2]
print(cnt)
* 풀이는 주석 참고
'백준 write-up > 정렬 & 그리디' 카테고리의 다른 글
[백준] 사과나무 : 19539번 - Python (0) | 2022.06.03 |
---|---|
[백준] Yangjojang of The Year : 11557번 - Python (0) | 2022.06.02 |
[백준] 거스름돈 : 14916번 - Python (0) | 2021.10.07 |
[백준] 포인트 카드 : 14471번 - Python (0) | 2021.10.04 |
[백준] 에너지 드링크 : 20115번 - Python (0) | 2021.09.07 |