파이썬으로 부시자! Python with Coreenee

BAEKJOON 14890

문제

스크린샷 2020-05-01 오후 11 17 42 스크린샷 2020-05-01 오후 11 17 49 스크린샷 2020-05-01 오후 11 17 55

입력

스크린샷 2020-05-01 오후 11 18 00


나의 처음 코드

이 문제는 케이스들을 잘 생각하면서 해야한다. 예를 들어 L=2일 때, [3, 2, 2, 2, 3] 처럼 경사로가 중복되는 케이스, [3,2,2,2,1,1] 처럼 아무 문제없이 경사로를 착착 넣을수 있는 케이스, [2, 2, 2, 3] 처럼 2와 3을 비교할 때 경사로를 넣을 수 있는가 하는 케이스. 처음에는 문제를 무적권 L에 맞춰서 경사로를 놓을 수 있는 공간 또한 L과 같아야하는 줄 알고 문제가 안 풀렸다,,, 사실 그게 아닌데,,,
나는 행과 열을 따로 저장해서 돌려주었다.(계산하기 싫어서 ㅎㅎ) 그리고 위에서 언급한 케이스를 생각하며 코드를 짰다. 마지막에 설명한 케이스에서 쉽게 경사를 놓을 수 있을지에 대한 여부를 알려면, 같은 높이를 만날 때마다 갯수를 저장해서 2와 3이 만났을 때 L과 갯수를 비교해서 가능 여부를 쉽게 계산할 수 있다. if문이 많은걸 좋아하지는 않지만, 생각없이 짜다가 결국엔 코드가 조금 많이 더러워졌다… 다음에는 먼저 좀 예외좀 생각하고 문제를 풀어야겠다.

N, L = list(map(int, input().split()))

garo_list = []
sero_list = [[0] * N for _ in range(N)]

#행별 리스트 받기, 열별 리스트 받기
for i in range(N):
    tmp_list = list(map(int, input().split()))
    garo_list.append(tmp_list)
    for j in range(N):
        sero_list[j][i] = tmp_list[j]
        
        
def solution(get_list):
    global N, L
    check_list = [0] * N
    cont_cnt = 1
    for nth in range(N-1):
        #현재 높이와 다음 높이 받기
        now_val, next_val = get_list[nth], get_list[nth+1]
        
        #경사로가 필요할 때
        if now_val != next_val:
            #높 -> 낮
            if now_val > next_val:
                #차이가 1이 아닐 때
                if now_val - 1 != next_val:
                    return False
                #경사로를 인덱스 안에 놓을 수 있을 때
                if nth + L < N:
                    for i in range(1, L+1):
                        if next_val == get_list[nth+i]:
                            #낮 -> 높으로 갈 때 중복으로 세지 않기 위한 리스트
                            check_list[nth+i] = 1
                        else:
                            return False
                else:
                    return False
            else:
                #낮 -> 높인 상황이 왔을 때, cont_cnt를 통해 경사로를 놓을 수 있을지 없을지 결정함
                #경사로를 놓을 수 없을 떄, 차이가 1이 아닐 때, 블록위에 이미 경사로가 놓아져있을 때
                if cont_cnt < L or now_val + 1 != next_val or check_list[nth] == 1:
                    return False
            cont_cnt = 1
        #높이가 같을 때
        else:
            #체크가 안 되어있다면, 갯수를 쌓아간다.
            if check_list[nth] != 1:
                cont_cnt += 1
            
    return True
    
cnt = 0 
for arr in garo_list:
    if solution(arr):
        cnt += 1
for arr in sero_list:
    if solution(arr):
        cnt += 1
        
print(cnt)