본문 바로가기

C programming/[Code Up]

[Code Up] 1476번 : 2차원 배열 빗금 채우기 3-1

728x90
반응형

난이도  ⭐️ ⭐️ ⭐️ ⭐️ 

문제 설명

 


 

[기초-배열연습] 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 입력이

codeup.kr


다음과 같은 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중 배열을 [101][101]로 선언한다.

② 입력 조건에 맞는 변수 n, m, i, j을 선언하고 scanf 함수를 통해 입력받는다.

③ 위의 i는 세로 이동을 위해 사용하고 j는 가로 이동을 위해 사용한다.

④ for 반복문을 선언하고 i가 1부터 (n+m) 이전까지 반복한다. 

더보기
int n,m,i,j=1,val=1;
int Arr[101][101] = {};

scanf("%d %d", &n, &m);

[ 반복문 ] (1)  i 가 1부터 (n+m) 이전까지 반복

① i의 값을 임시로 저장하는 temp_i 변수를 선언하고 i값을 저장한다.

② temp_i변수가 n보다 큰 지 확인한다.

- 이는 지정된 n값, 즉 세로 방향(아래)으로 내려가면 사선을 만드는 것에서 오른쪽으로 이동하며 사선을 만들기 위함이다.

③ temp_i변수가 보다 큰 경우, temp_i를 n 값으로 다시 초기화하고 가로 방향을 위해 j를 증가한다.

④ j의 값을 임시로 저장하는 temp_j 변수를 선언하고 j값을 저장한다.

더보기
for(i = 1;i< n+m;i++){
    int temp_i = i;

    if(temp_i > n){
        temp_i  = n;
        j++;
    }

    int temp_j = j;
//while문 생략
}

ㄴ [ 반복문 ]  (2) temp_i > 0 일 경우 반복

① while 함수를 이용해 temp_i가 0 이상일 때 동안 반복한다.

 Arr[temp_i][temp_j] 배열에 val을 저장하고 val을 증가한다. 이때 val은 배열에 들어가는 출력값이다.

 

인자의 조건은 아래와 같다.

 

(1) 이때 Arr에 들어가는 인자는 사선이동을 위해 증감연산 시작 시세로인자는 줄고 가로 인자는 늘어야 한다.

(2) 세로 인자 i의 증가는 최대 세로 범위인 n을 넘어서는 안되며 증가 연산에서 넘기는 경우 최대 n까지 더한다.

(3) 세로 인자의 최대 증가 시부터는 가로 이동을 위해 가로 이동 인자 j를 증가한다. 이때 세로 인자는 while 반복문 전에 초기화되어야 한다.

(4) 가로 인자의 증가 연산에서 가로의 최대 범위인 m을 넘겨서는 안 되며 넘기는 경우 while 반복을 종료하고 for으로 돌아간다.

더보기
while(temp_i > 0){
    Arr[temp_i][temp_j] = val;
    // printf("Arr[%d][%d] = %d\n",temp_i,temp_j,val);
    val ++;

    temp_i--;
    temp_j++;

    if(temp_j > m){break;}
}

< 배열 출력 >

연산한 배열을 출력한다. 이때 배열의 시작 인덱스를 (1, 1)부터 했다는 것을 잊지 않도록 한다.

더보기
for(int i = 1; i <= n; i++){
    for(int j = 1; j <= m ; j++){
        printf("%d ",Arr[i][j]);
    }
    printf("\n");
 }

정답 코드

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main(){
    int n,m,i,j=1,val=1;
    int Arr[101][101] = {};

    scanf("%d %d", &n, &m);
    for(i = 1;i< n+m;i++){
        int temp_i = i;
        if(temp_i > n){
            temp_i  = n;
            j++;
        }
        int temp_j = j;
        // printf("\n-------------- i = %d / temp_i = %d --------------\n",i,temp_i);
        while(temp_i > 0){
            Arr[temp_i][temp_j] = val;
            // printf("Arr[%d][%d] = %d\n",temp_i,temp_j,val);
            val ++;

            temp_i--;
            temp_j++;

            if(temp_j > m){break;}
        }
    }
      for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m ; j++){
            printf("%d ",Arr[i][j]);
        }
        printf("\n");
     }  
}

 

728x90
반응형
댓글