티스토리 뷰
Zig-zag Scanning은 2D Array의 Traversal 방법 중 하나로, 원소를 접근함에 있어 아래와 같이 지그재그 순으로 접근하는 기법입니다. 해당 Traversal 방법은 영상 압축 과정에서 주로 쓰입니다. 관련 내용으로 [H.264] Quantization(양자화)과 Zig-zag scanning 을 참고해보시면 도움이 될 것 같습니다.
위 그림을 보며 원소 접근 방식을 분석해보면 중간중간 방향을 전환하는 분기점이 존재합니다. 그리고, 분기점의 y, x 위치(행렬로 치면 행, 열)에 따라 하향 혹은 우향 방향에 존재하는 원소를 한 번 접근한다음 좌하향 대각선 방향 혹은 우상향 대각선 방향으로 원소를 쭈욱 접근 하는 규칙을 가지고 있음을 확인할 수 있습니다.
C++을 이용하여 이를 구현해보았습니다.
코드
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n;
cin >> n;
vector<vector<int>> scan_order_table(n, vector<int>(n, 0));
scan_order_table[0][0] = 1;//order 1부터 numbering
for(int order = 2, y = 0, x = 0, dir = 1; order <= n * n;)
{
//분기점에서 하향 혹은 우향 방향으로 y, x 이동
if(x == n-1) y += 1;
else if(y == n-1) x += 1;
else if(y == 0) x += 1;
else if(x == 0) y += 1;
while(y >= 0 and x >= 0 and y <= n-1 and x <= n-1)
{
scan_order_table[y][x] = order++;
//dir=1이면 좌하향 방향으로 순서 증가, dir=-1이면 우상향 대각선으로 순서 증가
y += dir;
x -= dir;
}
//위 반복문을 거치면 y와 x가 array size를 벗어나게 되므로 이를 역으로 보상해주어야함
y -= dir;
x += dir;
//방향 반전
dir = -dir;
}
for(int y = 0; y < n; y++)
{
for(int x = 0; x < n; x++)
{
cout << scan_order_table[y][x] << " ";
}
cout << "\n";
}
return 0;
}
실행 결과 예시
n == 1
1
n == 2
1 2
3 4
n == 3
1 2 6
3 5 7
4 8 9
'Problem Solving' 카테고리의 다른 글
2075-N번째 큰 수 (0) | 2020.11.03 |
---|---|
실용적인 알고리즘 정리 (0) | 2020.10.01 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Lowest Common Ancestor
- LCA
- 가장 긴 증가하는 부분 수열
- ㅂ
- 백준 11437
- 백준 11053
- MOT
- FairMOT
- 단축키
- 이분탐색
- 인공지능을 위한 선형대수
- 순열
- 자료구조
- 백트래킹
- PyCharm
- 백준
- 위상 정렬 알고리즘
- C++ Deploy
- 문제집
- cosine
- 조합
- 파이참
- 백준 1766
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함