[백준 14890번] 경사로 - Python으로 구현하기
문제 접근
- 경사로를 놓을 수 있는 방법 : 높은 곳 -> 낮은 곳 / 낮은 곳 -> 높은 곳
- 경사로가 겹치면 안되므로 경사로가 놓여진 부분은 따로 체크해주기
- 2d에서 행과 열을 모두 확인해봐야 되는 문제이다. 행에 대한 구현만 완료한 뒤 2d 행렬을 트랜스포즈하여 열을 확인하자.
- Python에서 2D array transpose : t_arr = list(zip(*arr))
생각해볼 점
- [i][j] , [j][i] 의 순서로 이중 반복문 하나로 한번에 처리 가능하다 => 사실 트랜스포즈 과정이 필요없다.
오답 분석
- 인덱스 표현에 주의하고 정확하게 하자! 한군데 틀리면 찾기 힘들다.
- 인덱스를 다루는 문제일 수록 경계값 처리 꼼꼼하게 확인하기
def row_solve(arr):
global cnt
chk = [[False] * n for _ in range(n)]
for i in range(n):
j = 0
go_flag = True
while j < n - 1:
if arr[i][j] == arr[i][j + 1]:
j += 1
continue
elif arr[i][j] - arr[i][j + 1] == 1: # 높->낮
if arr[i][j + 1:j+1+L].count(arr[i][j+1]) == L:
chk[i][j + 1:j + 1 + L] = [True] * L
j = j + L
continue
else:
go_flag = False
break
elif arr[i][j] - arr[i][j + 1] == -1: # 낮->높
if arr[i][j+1 - L:j+1].count(arr[i][j]) == L and True not in chk[i][j+1 - L:j+1]:
chk[i][j+1 - L:j+1] = [True] * L
j += 1
continue
else:
go_flag = False
break
else:
go_flag = False
break
if go_flag:
cnt += 1
n,L=map(int,input().split())
map_data = [list(map(int,input().split())) for _ in range(n)]
cnt = 0
row_solve(map_data)
row_solve(list(zip(*map_data)))
print(cnt)
* 틀린 부분이나 더 나은 방법이 있을 수 있습니다. 지적해주시면 감사하겠습니다!!
'posts' 카테고리의 다른 글
[백준 15684번] 사다리 조작 - Python으로 구현하기 (0) | 2019.10.18 |
---|---|
[백준 14891번] 톱니바퀴 - Python으로 구현하기 (0) | 2019.10.18 |
[백준 14889번] 스타트와 링크 - Python으로 구현하기 (0) | 2019.10.17 |
[백준 14888번] 연산자 끼워넣기 - Python으로 구현하기 (0) | 2019.10.17 |
[백준 14503번] 로봇 청소기 - Python으로 구현하기 (0) | 2019.10.17 |