코딩테스트/코드업

2차원 배열 달팽이 채우기 4-1 C++(1484)[코드업, code up]

멍토 2019. 12. 22.

※ 저의 풀이가 무조건적인 정답은 아닙니다.

다른 코드가 좀 더 효율적이고 좋을 수 있습니다.

다른사람들의 풀이는 언제나 참고만 하시기 바랍니다.

문제 주소입니다.

https://codeup.kr/problem.php?id=1484

 

[기초-배열연습] 2차원 배열 달팽이 채우기 4-1

다음과 같은 n*m 배열 구조를 출력해보자. 입력이 3 4인 경우 다음과 같이 출력한다. 1 2 3 4 10 11 12 5 9 8 7 6 입력이 4 5인 경우는 다음과 같이 출력한다. 1 2 3 4 5 14 15 16 17 6 13 20 19 18 7 12 11 10 9 8 입력이 n m인 경우의 2차원 배열을 출력해보자.

codeup.kr


1. 문제

2. 문제 해석

3. 소스 코드


문제

다음과 같은 n*m 배열 구조를 출력해보자.

입력이 3 4인 경우 다음과 같이 출력한다.
1 2 3 4
10 11 12 5
9 8 7 6

입력이 4 5인 경우는 다음과 같이 출력한다.
1 2 3 4 5
14 15 16 17 6
13 20 19 18 7
12 11 10 9 8

입력이 n m인 경우의 2차원 배열을 출력해보자.

 

입력

첫 번째 줄에 배열의 크기 n m이 입력된다.
[입력값의 정의역]
1<=  n,m <= 100

출력

n*m 크기의 배열을 설명과 같이 채워 출력한다.

입력 예시

2 3

출력 예시

1 2 3

6 5 4


2. 문제풀이

정보처리기사 알고리즘 예시에도 비슷하게 나와있는 문제입니다.

처음에는 가로로 증가

다음은 세로로 증가

다음은 가로로 감소

다음은 세로로 감소 인데요

증가와 감소가 바뀔때마다 최대로 쓸수있는 칸이 1칸씩 줄어듭니다.

 

따라서 limit를 설정해서 증가 감소할때 셋팅을 해주시면 됩니다.

코드는  아래에 있습니다.

 


3. 소스코드

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
32
33
#include <iostream>
 
using namespace std;
 
int main() {
    int a[100][100]{ 0 }, n, m, row = 0, col = -1, reverse = 1;
    cin >> n >> m;
    int limit = 0;
    //총반복의 횟수는 n*m의 숫자까지
    for (int count = 1; count <= n * m;) {
        //가로채우기
        for (int i = 0; i < m - limit; i++) {
            col += reverse;
            a[row][col] = count++;
        }
        //세로 채우기
        for (int i = 0; i < n - limit - 1; i++) {
            row += reverse;
            a[row][col] = count++;
        }
        //최대 반복횟수 감소
        limit++;
        //반복이 한번될때마다 역전시킨다.
        reverse = -reverse;
    }
 
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++)
            cout << a[i][j] << " ";
        cout << endl;
    }
    return 0;
}

댓글

💲 광고입니다.