코딩테스트/코드업

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

멍토 2019. 12. 23.

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

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

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

문제 주소입니다.

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

 

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

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

codeup.kr


1. 문제

2. 문제 해석

3. 소스 코드


문제

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

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

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

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

 

 

입력

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

출력

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

입력 예시

2 3

출력 예시

5 6 1

4 3 2


2. 문제풀이

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

오른쪽 위에서부터 출발합니다.

반바퀴씩 돌때마다 limit를 증가시키기 때문에

여기에 유의하셔야 합니다.

1. 행이 증가합니다. 

2. 뒤부터는 감소가되므로 더해주는 부분을 뒤집습니다.

reverse = -reverse;

or

reverse *= -1;

3. 열이 감소합니다. 

3. 행이 감소합니다. 

4. 뒤부터는 증가가 되므로 더해주는 부분을 뒤집습니다.

reverse = -reverse;

or

reverse *= -1;

4. 열이 증가합니다. col = 0 -> m-2;

 

시작하는 위치와 뒤집는 부분을 파악하시면 금방 푸는 문제입니다.

 

 


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

댓글

💲 광고입니다.