BAEKJOON 14890
문제
입력
나의 처음 코드
이 문제는 케이스들을 잘 생각하면서 해야한다. 예를 들어 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)