아래는 소스코드다, v 벡터의 크기와 상관 없이 달팽이 방향으로 순회한다, 로직은 매우 간단하다.
sr = 행 시작, sc = 열 시작, er = 행 끝, ec = 열 끝
좌측에서 우측으로 순회할 때마다 시작되는 행을 한 칸씩 증가
상 측에서 하 측으로 순회할 때마다 끝나는 열을 한 칸씩 축소
우측에서 좌측으로 순회할 때마다 끝나는 행을 한 칸씩 축소
하 측에서 상 측으로 순회할 때마다 시작되는 열을 한 칸씩 증가
순회할 때마다 배열에 저장 후 기반 범위 for문 써서 출력.
#include <limits.h>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
vector<int> ans;
vector<vector<int>> v
{
{ 1, 2, 3, 4},
{ 8, 6, 7, 9},
{ 6, 1, 5, 4},
{ 3, 2, 8, 3}
};
int h = v.size(), w = v[0].size();
int sr, er, sc, ec;
sr = sc = 0;
er = h - 1;
ec = w - 1;
int cnt = 0;
while (sr <= er &&
sc <= ec)
{
// 좌 > 우
for (int i = sc; i <= ec; i++)
ans.push_back(v[sr][i]);
sr++;
// 상 > 하
for (int i = sr; i <= er; i++)
ans.push_back(v[i][ec]);
ec--;
// 우 > 좌
for (int i = ec; i >= sc; i--)
ans.push_back(v[er][i]);
er--;
// 하 > 상
for (int i = er; i >= sr; i--)
ans.push_back(v[i][sc]);
sc++;
}
for (auto& i : ans)
cout << i << ' ';
}
// 결과
1 2 3 4 9 4 3 8 2 3 6 8 6 7 5 1
3x3
vector<vector<int>> v
{
{ 1, 2, 3},
{ 8, 6, 7},
{ 6, 1, 5}
};
// 결과
1 2 3 7 5 1 6 8 6
'코딩테스트 > 코딩테스트 알고리즘' 카테고리의 다른 글
[C] 이진 탐색 (Binary Search) 알고리즘 개념과 예제 (0) | 2023.08.23 |
---|---|
오목 AI 제작 - MIN_MAX 전략을 통한 필승 수 구현 (0) | 2023.08.14 |
투 포인터 알고리즘(Two Pointers Algorithm) (0) | 2023.08.13 |
스위핑 알고리즘 (Sweeping algorithm) (0) | 2022.11.23 |
구조체 또는 클래스 관련 정렬 (sort 함수) (0) | 2022.08.26 |