더북(TheBook)

3. 배열의 끝에 닿으면 방향을 변경합니다.

n = 4라면 공식에 따라 반복문이 총 10번 돌아가면서 배열 할당을 시도합니다. 그러나 배열의 크기는 10보다 작고(삼각형의 높이), 5개 이상의 요소를 탐색하려고 하면 없는 곳을 참조했기 때문에 오류가 발생하면서 프로그램이 강제로 종료됩니다. 따라서 다음 배열이 존재하는지 꼭 확인해야 합니다. 더불어 회전하면서 다음 배열이 존재하지만 이미 값이 할당된 상태라면 충돌로 판정하므로 해당 부분 또한 확인해야 합니다.

if 0 <= ny < n and 0 <= nx <= ny and snail[ny][nx] == 0:
    y, x = ny, nx
else:
    angle = (angle + 1) % 3
    y += dy[angle]
    x += dx[angle]

충돌이 아니라면 값을 할당하고, 충돌이라면 진행 방향을 변경하는 방식으로 진행합니다. 여기까지의 과정이 머리로 그려지면 문제를 푼 것이나 다름없습니다.

4. 삼각형을 모두 채웠다면 배열을 1차원으로 만들어 정답을 제출합니다.

앞에서 짠 코드에 while cnt <= size 조건이 있으므로 n의 크기만큼 배열을 모두 채우면 자동으로 while 문을 벗어납니다. 이때 나오는 snail 배열을 1차원 배열로 압축(flatten)하여 반환하면 문제를 해결할 수 있습니다.

return [i for j in snail for i in j]

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.