코딩 공부

[Python] 백준 14890번 : 경사로 본문

삼성 SW 역량 테스트 기출 문제

[Python] 백준 14890번 : 경사로

Algomalgo 2024. 5. 21. 17:48
728x90

14890번: 경사로 (acmicpc.net)


<접근 방법>

  1. 한 칸씩 스캔하면서 "앞쪽 블록 > 뒤쪽 블록"일 경우와 "앞쪽 블록 < 뒤쪽 블록"일 경우로 나뉜다고 생각함.
  2. 이때, 높이 차이가 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