문제 링크
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PobmqAPoDFAUq
C++ 풀이
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<vector<int>>Dir = { {0, 1}, {1, 0}, {0, -1}, {-1, 0} }; //오른쪽, 아래, 왼쪽, 위
vector<vector<int>>Board(10, vector<int>(10)); //-1로 초기화된 배열
for (int i = 0; i < 10; ++i) {
for (int j = 0; j < 10; ++j)
Board[i][j] = -1;
}
int tc, N, i, cur_Dir, x, y;
cin >> tc;
for (int t = 1; t <= tc; ++t) {
vector<vector<int>>temp = Board;
cur_Dir = 0; //현재 진행 방향
x = 0; y = 0; //현재 좌표
cin >> N;
for (i = 1; i <= (N * N); ++i) {
temp[x][y] = i;
//좌표 범위(0 ~ N - 1)를 넘었거나 이미 칸이 채워진 경우 진행방향을 바꿈
if (x + Dir[cur_Dir][0] > N - 1 || x + Dir[cur_Dir][0] < 0 ||
y + Dir[cur_Dir][1] > N - 1 || y + Dir[cur_Dir][1] < 0 ||
temp[x + Dir[cur_Dir][0]][y + Dir[cur_Dir][1]] != -1) {
cur_Dir++;
if (cur_Dir >= 4)
cur_Dir = 0;
}
x += Dir[cur_Dir][0];
y += Dir[cur_Dir][1];
}
cout << "#" << t << endl;
for (int m = 0; m < N; ++m) {
for (int n = 0; n < N; ++n)
cout << temp[m][n] << " ";
cout << '\n';
}
}
}
4가지 진행 방향의 좌표를 저장하여 풀이하였다.
다음 좌표값이 좌표 범위(0 ~ N - 1)를 넘었거나 이미 칸이 채워진 경우 진행방향을 바꾸면서 칸을 채워나갔다.
반응형
'알고리즘 · 코딩' 카테고리의 다른 글
[HackerRank] Inherited Code (0) | 2022.03.08 |
---|---|
[LeetCode] Two Sum (0) | 2022.02.25 |
[프로그래머스] n^2 배열 자르기 (0) | 2021.12.23 |
[프로그래머스] 전력망을 둘로 나누기 (0) | 2021.12.22 |
[백준 5620번] 가장 가까운 두 점의 거리 (0) | 2021.11.06 |