최종 제출 코드
import math
n, m, k = map(int, input().split())
def make_arr(arr):
answer = []
for i in range(len(arr)):
for j in range(len(arr[i])):
answer.append(arr[i][j])
return answer
def solution(n, m, k):
if m+k>n+1: return
arr = []
if m>=k:
for i in range(n+1-m, -m, -m):
arr.append([j for j in range(i, i+m) if j>0])
down = math.ceil(n/m)
if down == k: return make_arr(arr)
elif down>k: return
else:
target = k-down+1
if len(arr[1])>=target:
arr[1][:target] = sorted(arr[1][:target],reverse=True)
return make_arr(arr)
return
else:
for i in range(1, n+1, k):
arr.append([j for j in range(k+i-1, i-1, -1) if j<=n])
up = math.ceil(n/k)
if up == m: return make_arr(arr)
elif up > m: return
else:
target = m-up+1
if len(arr[-1])>=target:
arr[-1][:target] = sorted(arr[-1][:target])
return make_arr(arr)
return
answer = solution(n, m, k)
if answer:print(*answer)
else: print(-1)
dfs로 풀이했다. 그런데 역시나 테스트케이스만 돌려보는데도 실행시간이 너무 길게 걸렸다. 코드를 제출하면 100% 시간초과가 뜰거라고 확신.if m>=k 부분의 코드를 그림으로 표현하면 아래와 같다
n = 15, m = 5, k = 4라고 가정하자.m(=5)개씩 끊어 배열을 생성한다. (이때 배열은 오름차순 정렬)n개가 된다!!!!! (ex. 1 2 3 4 5 / 6 7 8 9 10 / 11 12 13 14 15)m개를 초과할 수 없는 이유이다k < math.ceil(n/m)인 경우는 수열 생성이 불가능한 케이스다. None을 반환한다.k == math.ceil(n/m)인 경우, 이미 k개만큼의 감소하는 수열이 생성되어 있다.k > math.ceil(n/m)인 경우, 이미 math.ceil(n/m) 길이의 감소하는 배열은 생성되어 있다.target = k - math.ceil(n/m) + 1target보다 작다면 감소하는 수열의 길이를 만족시킬 수 없다. None을 반환한다.target보다 크거나 같다면, 배열내의 원소를 target개수만큼 내림차순 정렬한다.m < k의 경우도 같은 논리를 적용시켜 약간의 수정만 해주면 된다.k가 더 큰 경우는 감소하는 수열을 먼저 확보하고 시작해야 하기 때문에 오름차순으로 k개씩 끊어, 행 내의 원소가 내림차순된 배열을 생성한다.target만큼 오름차순 정렬로 변경하면 된다.