반응형
SMALL
1. 첫번째 방법
이차원배열의 행열을 x,y로 두고 차례대로 횟수만큼 채워간다.
좌표 증가후 이차원배열에 수대입!! 대입을 먼저 한 후 증가하게되면 모서리부분(?)에서 수가 넘어가버린다.
-> y++
-> 이동횟수 감소
-> x++
-> 이동횟수 감소
-> x--
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
int num = 1;
int x = 0;
int y = -1;
int m = n; // 이렇게 안해놓으면 출력 시 문제
// int arr[100][100]; 이렇게 하면 메모리 문제생김(오류는 안남)
int** arr = new int* [n]; // 이부분만 c++이용하여 메모리 할당
for (int i = 0; i < n; i++) {
arr[i] = new int[n];
}
while (n > 0) {
for (int j = 0; j < n; j++) {
y++;
arr[x][y] = num++;
}
n--; // 이동횟수 감소
for (int j = 0; j < n; j++) {
x++;
arr[x][y] = num++;
}
for (int j = 0; j < n; j++) {
y--;
arr[x][y] = num++;
}
n--; // 이동횟수 감소
for (int j = 0; j < n; j++) {
x--;
arr[x][y] = num++;
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < m; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
for (int i = 0; i < n; i++) {
delete[] arr[i];
}
delete[] arr;
return 0;
}
2. 두번째 방법
진행방향으로 이동을 하다가 벽을 만나면 바꾸는 방식.
배열 전체를 0으로 초기화 한 후 출력할 영역 바깥 부분을 모두 1로 채워서 테두리를 만든다.
채워나가다가 다음에 이동할 위치에 채울 수 없다면(0이 아니면(1이 있으니까) )이동을 멈추고 방향을 바꾼다.
#include <stdio.h>
#include <string.h>
int main() {
int n;
scanf("%d", &n);
int num = 1;
int x = 1;
int y = 0;
int m = n;
// int arr[100][100];
int** arr = new int* [n+2];
for (int i = 0; i < n+2; i++) {
arr[i] = new int[n+2];
memset(arr[i], 0, sizeof(int) *(n+2));
}
// 테두리를 둘러싸면 행열 2칸씩 늘어남 주의!!
// 바깥테두리 1로 초기화
for (int i = 0; i <n+2; i++) {
for (int j = 0; j <n+2; j++) {
if (i == 0 || j == n+1 || i == n+1 || j == 0) {
arr[i][j] = 1;
}
}
}
while (num<=n*n) { // 채울수가 n*n 이하인 동안
while (arr[x][y + 1] == 0) { // 오른쪽이 0인동안
y++;
arr[x][y] = num++;
}
while (arr[x + 1][y] == 0) {
x++;
arr[x][y] = num++;
}
while (arr[x][y - 1] == 0) {
y--;
arr[x][y] = num++;
}
while (arr[x - 1][y] == 0) {
x--;
arr[x][y] = num++;
}
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= m; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
for (int i = 0; i < n+2; i++) {
delete[] arr[i];
}
delete[] arr;
return 0;
}
반응형
LIST
'정올 문제풀이' 카테고리의 다른 글
정올 1009 : 각 자릿수의 역과 합 (0) | 2020.04.28 |
---|---|
정올 1331 : 문자마름모 (0) | 2020.04.28 |
정올 1339 : 문자삼각형 2 (0) | 2020.04.27 |
정올 1002 : 최대공약수, 최소공배수 응용 (0) | 2020.04.27 |
정올 1658 : 최대공약수, 최소공배수 (+유클리드 호제법) (0) | 2020.04.27 |
댓글