byworld 님의 블로그

20260501 나선형(달팽이) 배열 본문

TIL

20260501 나선형(달팽이) 배열

byworld 님의 블로그 2026. 5. 1. 15:18

https://school.programmers.co.kr/learn/courses/30/lessons/181832

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

내 코드

#include <string>
#include <vector>

using namespace std;

vector<vector<int>> solution(int n) {
    vector<vector<int>> answer(n,vector<int>(n,0));
    int t=0;
    for(int i=0;i<n;++i){answer[0][i]=++t;}
    int row=0;int col=n-1;
    int arrow[2][4]={{0,1,-1,0},{0,-1,1,0}};
    int right=0;int down=1; int count=n-1;
    int an=0;
    while(count>0){
        right=arrow[an][0];
        down=arrow[an][1];
        for(int k=0;k<count;++k){
            col+=right;row+=down;
            answer[row][col]=++t;
        }
        right=arrow[an][2];
        down=arrow[an][3];
        for(int k=0;k<count;++k){
            col+=right;row+=down;
            answer[row][col]=++t;
        }
        ++an;
        an%=2;
        --count;
    }
    return answer;
}

 

1. 문제 핵심

n×n 배열을 나선형으로 채우는 문제는 단순 구현처럼 보이지만, 실제로는 다음을 요구한다:

방향 전환 + 반복 길이 감소 패턴 설계


2. 내가 사용한 접근 방식

 
int arrow[2][4] = {
    {0, 1, -1, 0},   // 아래, 왼쪽
    {0, -1, 1, 0}    // 위, 오른쪽
};
 
  • 방향을 2개 그룹으로 나눔
  • 한 번에 2방향씩 처리 (↓, ← / ↑, →)
  • count를 줄여가며 반복

3. 핵심 로직

 
while (count > 0) {
    // 첫 방향 이동
    for (k < count)

    // 두 번째 방향 이동
    for (k < count)

    방향 전환
    count 감소
}
 

이 구조의 의미:

  • n-1 → n-1 → n-2 → n-2 → ... → 1 → 1
  • 즉, 이동 길이가 2번씩 반복되며 감소

4. 이 접근의 장점

✔ 경계 체크가 필요 없음
✔ 방문 여부 체크 불필요
✔ 반복 횟수만으로 제어 가능

→ 조건문 실수 줄어듦


5. 아쉬운 점 (중요)

(1) 방향 변수 명확성 부족

 
int right, down;
 

실제 의미는:

col 변화량 / row 변화량

더 좋은 이름:

 
int dr, dc;
 
미적분 할때 delta 약자로 d

(2) arrow 구조 직관성 부족

 
int arrow[2][4]
 

→ 의미 파악 어려움

대안:

 
vector<pair<int,int>> dirs = {
    {0,1}, {1,0}, {0,-1}, {-1,0}
};
 

근데 좀 이건 pair에서 first second 꺼내 쓰는 것이나 여러 개 설정이 필요하긴 하다. 난 귀찮아서  그냥 arrow로만 했다.


6. 다른 풀이와 비교

(1) 방문 체크 방식

 
if (범위 밖 or 이미 방문) 방향 전환
 
  • 직관적
  • 하지만 조건문 많음

(2) 경계 축소 방식

 
top++, bottom--, left++, right--
 
  • 가장 일반적
  • 구조 명확

(3) 현재 방식 (내 코드)

  • 반복 길이 기반
  • 가장 “수학적인” 접근

7. 핵심 교훈

2차원 문제는 방향 + 반복 패턴으로 단순화할 수 있다

특히 이 문제에서 얻은 것:

  • 방향 전환을 “조건”이 아니라 패턴으로 처리 가능
  • 반복 횟수만으로 경계를 제어할 수 있음

8. 개선 방향

  • 방향 벡터 의미 명확하게
  • 변수명 (row/col, dr/dc) 일관성 유지
  • 트릭보다 가독성 우선