코딩테스트/코드업

2차원 배열 빗금 채우기 3-1 C++(1476)[코드업, code up]

멍토 2019. 12. 19.

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

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

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

문제 주소입니다.

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

 

[기초-배열연습] 2차원 배열 빗금 채우기 3-1

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

codeup.kr


1. 문제

2. 문제 해석

3. 소스 코드


문제

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

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

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

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

입력

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

출발

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

입력 예시

2 3

출력 예시

1 3 5

2 4 6


2. 문제풀이

이 문제는 기초문제인데 생각보다 어려웠습니다.

프로그래머스 문제를 풀기전에 머리풀기 용으로 하나씩 하고있는데

어떻게 접근을 해야하나 고민을 많이했습니다.

결론은 자리수를 이용한 계산입니다.

여기서 원하는 배열은 왼쪽위부터해서 오른쪽위로 올라가는 구조입니다

00 01 02
10 11 12
20 21 22

잘보시면 자리수를 더하면 같은수가 나옵니다.

처음은 0 두번째는 1, 세번째는 2 마지막은 4입니다.

다른 수들도 바꿔가며 계산을 해보았더니 n+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
#include <iostream>
 
using namespace std;
 
int main() {
    int a[100][100], n, m;
    bool check{ true };
    cin >> n >> m;
    //자리수를 더하면 같은수가 나온다.
    for (int j = 0, count = 1; j <= n + m - 2; j++) {
        //열 반복
        for (int i = 0; i < m; i++) {
            //행 반복
            for (int k = 0; k < n; k++) {
                //행과 열의 합이 j와 같다면 count 넣고 증가시키기
                if (i + k == j) {
                    a[k][i] = count++;
                    break;
                }
            }
        }
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++)
            cout << a[i][j] << " ";
        cout << endl;
    }
    return 0;
}

댓글

💲 광고입니다.