프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
삼각 달팽이는 높이가 n인 삼각형 공간을 반시계 방향 나선형으로 채워나가는 문제입니다. 2차원 배열의 인덱스를 직접 제어하는 시뮬레이션 역량이 요구되며, 방향 전환 규칙을 코드로 구현하는 것이 핵심입니다.
1. 나의 풀이 (Modular Approach)
from itertools import chain
def write(board, start_pos, write_count, current_num, direction):
"""
지정된 방향으로 정해진 횟수만큼 숫자를 기입합니다.
"""
row = start_pos[0]
col = start_pos[1]
for _ in range(write_count):
row += direction[0]
col += direction[1]
board[row][col] = current_num
current_num += 1
return [row, col], current_num
def solution(n):
# 각 행마다 필요한 크기만큼만 리스트 할당
board = [[0] * i for i in range(1, n + 1)]
# 초기 좌표 설정 (첫 이동 시 [0, 0]이 되도록 조정)
pos = [-1, 0]
current_num = 1
# 아래, 오른쪽, 왼쪽 위 대각선 순서의 방향 벡터
dr = [1, 0, -1]
dc = [0, 1, -1]
direction_counter = 0
# n부터 1까지 이동 거리가 1씩 줄어드는 규칙 활용
for write_count in range(n, 0, -1):
current_dr = dr[direction_counter % 3]
current_dc = dc[direction_counter % 3]
pos, current_num = write(
board,
pos,
write_count,
current_num,
(current_dr, current_dc)
)
direction_counter += 1
# 2차원 배열을 1차원으로 평탄화하여 결과 반환
return list(chain.from_iterable(board))
2. 오늘 배운 점 및 복기 노트
방향 벡터와 모듈러 연산의 결합
이전에는 각 방향(아래, 오른쪽, 위)마다 별도의 함수를 정의하여 호출했으나, 방향 벡터 리스트와 나머지 연산(%)을 활용하여 하나의 루프로 통합했습니다. 이를 통해 중복 코드를 제거하고 로직의 일관성을 확보할 수 있습니다.
좌표 초기값 보정 테크닉
첫 번째 숫자가 기록되는 위치가 [0, 0]이고 첫 이동 방향이 아래쪽(row + 1)임을 고려하여, 시작 좌표를 [-1, 0]으로 설정했습니다. 이러한 보정은 반복문 내에서 첫 번째 요소에 대한 예외 처리를 생략할 수 있게 해줍니다.
동적 2차원 배열 생성
n * n 크기의 정방형 배열을 만든 뒤 사용하지 않는 공간을 두는 방식보다, [[0] * i for i in range(1, n + 1)]와 같이 각 행의 크기를 다르게 생성하는 것이 메모리 효율 측면에서 유리하다는 점을 확인했습니다.
3. 프로그래머스 코딩 테스트 문제 풀이 전략 교재에서 배울만한 점
반시계 나선형의 수학적 규칙성
교재에서는 삼각형을 왼쪽으로 정렬했을 때 발생하는 좌표 변화를 명확히 제시하고 있습니다. '아래 -> 오른쪽 -> 왼쪽 위 대각선'으로 이어지는 세 가지 방향이 반복된다는 점을 파악하는 것이 설계의 핵심입니다.
종료 조건의 최적화
전체 숫자의 개수는 1부터 n까지의 합인 $$\frac{n(n+1)}{2}$$로 계산됩니다. while 문을 사용하여 숫자를 하나씩 채울 때 이 수학적 한계치를 종료 조건으로 설정하면 루프 범위를 정확하게 제어할 수 있습니다.
평탄화(Flatten) 라이브러리 활용
2차원 리스트를 1차원으로 변환할 때 리스트 컴프리헨션 외에도 itertools.chain.from_iterable을 사용하는 방법을 익혔습니다. 대규모 데이터를 다룰 때 가독성과 성능 면에서 유용한 선택지가 될 수 있습니다.
'알고리즘 > 프로그래머스 문제 풀이 전략' 카테고리의 다른 글
| 문제4 - 거리두기 확인하기 (Python) (0) | 2026.04.21 |
|---|---|
| 문제2 - 행렬 테두리 회전하기 (Python) (0) | 2026.04.20 |
| 문제1 - 교점에 별 만들기 (Python) (0) | 2026.04.20 |
