Notice
Recent Posts
Recent Comments
Link
byworld 님의 블로그
20260501 나선형(달팽이) 배열 본문
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) 일관성 유지
- 트릭보다 가독성 우선
'TIL' 카테고리의 다른 글
| 개발 문화/협업에서 자주 쓰는 용어 정리 (1) | 2026.05.08 |
|---|---|
| 20260430 프로그래머스 최댓값 만들기(2) (0) | 2026.05.02 |
| 20260430 프로그래머스 기초 문제 다 부숴버리기 (0) | 2026.04.29 |
| 20260429 HTTP 상태 코드와 400 vs 422 사이에서의 고민 (0) | 2026.04.29 |
| 20260427 헥사고널이 이벤트 기반 구조에 유리한 이유와 트레이드오프 (0) | 2026.04.27 |