본문 바로가기

백준 write-up/정렬 & 그리디

[백준] 방탈출 : 15729번 - Python

728x90
반응형

https://www.acmicpc.net/problem/15729

 

15729번: 방탈출

첫째 줄에 N(1 ≤ N ≤ 1,000,000)가 주어지고 둘째 줄에는 쪽지에 적혀 있는 N자리의 수가 빈 칸을 사이에 두고 주어진다.

www.acmicpc.net

 

 

 

문제를 풀면서 몰랐던 개념

 

(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)

* 풀이는 주석 참고

728x90
반응형