Notice
Recent Posts
Recent Comments
Link
코딩 공부
[Python] 백준 14890번 : 경사로 본문
728x90
<접근 방법>
- 한 칸씩 스캔하면서 "앞쪽 블록 > 뒤쪽 블록"일 경우와 "앞쪽 블록 < 뒤쪽 블록"일 경우로 나뉜다고 생각함.
- 이때, 높이 차이가 1을 초과하거나 경사로를 뒀을 때 범위 밖으로 튀어나간다면 조건에 부합하지 않음을 고려했고, 또한 경사로를 놓는 위치들은 모두 높이 값이 같아야 함을 유의함.
def sol():
global count
visited = [[0] * N for _ in range(N)]
for i in range(N):
flag = False
for j in range(N-1):
# 앞 > 뒤
if abs(arr[i][j] - arr[i][j+1]) > 1: # 높이 차가 1 초과라면
flag = True
break
if arr[i][j] > arr[i][j+1]:
if j+L >= N: # 경사로를 두는 곳이 범위 밖으로 나가면
flag = True
break
for k in range(j+1, j+1+L):
if arr[i][k] != arr[i][j+1]: # 경사로를 놓는 곳들의 높이가 일치하지 않는다면
flag = True
break
visited[i][k] = 1
if flag: break
if flag: continue
for j in range(1, N):
# 앞 < 뒤
if arr[i][j] > arr[i][j-1]:
if j-L < 0: # 경사로를 두는 곳이 범위 밖으로 나가면
flag = True
break
for k in range(j-1, j-1-L, -1):
if visited[i][k] or arr[i][k] != arr[i][j-1]: # 경사로가 이미 놓아져 있거나 경사로를 놓는 곳들의 높이가 일치하지 않는다면
flag = True
break
if flag: break
if not flag:
count += 1
N, L = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(N)]
count = 0
sol()
t_arr = [[0]*N for _ in range(N)]
for i in range(N):
for j in range(N):
t_arr[i][j] = arr[j][i]
arr = t_arr
sol()
print(count)
이해가 가지 않는 부분이 있다면 질문 주세요. 감사합니다.
728x90
'삼성 SW 역량 테스트 기출 문제' 카테고리의 다른 글
[Python](시뮬) 백준 20056번 : 마법사 상어와 파이어볼 (0) | 2024.03.11 |
---|---|
[Python] 백준 17140번 : 이차원 배열과 연산 (2) | 2024.03.09 |
[Python](시뮬) 백준 17144번 : 미세먼지 안녕! (0) | 2024.03.04 |
[Python](BFS) 백준 16234번 : 인구 이동 (0) | 2024.03.01 |
[Python](DFS) 백준 15683번 : 감시 (0) | 2024.03.01 |