문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/389478

제한 사항

입출력 예

풀이
def solution(n, w, num):
height = n // w + (n % w != 0 if 1 else 0)
result = [[] for _ in range(height)]
answer_index = -1
# 홀수층
count = 0
for i in range(0, n, 2 * w):
for j in range(i, i + w):
if j == n:
break
result[count].append(j + 1)
if j + 1 == num:
answer_index = len(result[count]) - 1
# 빈 공간 -1로 채우기
if len(result[count]) < w:
for k in range(w - len(result[count])):
result[count].append(-1)
count += 2
# 짝수층
count = 1
for i in range(w, n, 2 * w):
for j in range(i, i + w):
if j == n:
break
result[count].append(j + 1)
if j + 1 == num:
answer_index = w - len(result[count])
# 짝수층은 결과 반대로
result[count].sort(reverse=True)
# 빈 공간 -1로 채우기
if len(result[count]) < w:
for k in range(w - len(result[count])):
result[count].insert(0, -1)
count += 2
answer = 1
for i in range(height - 1, -1, -1):
if result[i][answer_index] == num:
return answer
if result[i][answer_index] != -1:
answer += 1
후기
먼저 홀수층과 짝수층으로 나누고 홀수층은 순서 그대로, 짝수층은 결과를 반대로 뒤집어준다.
주의해야 할 점은 마지막 층의 빈 공간이 -1이나 기타 다른 것으로 채워지지 않으면 박스를 꺼내는 행위인 세로 인덱스 계산에서 틀어질 수가 있다.