본문 바로가기

C programming/[Code Up]

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

728x90
반응형

난이도  ⭐️ ⭐️ ⭐️ 

문제 설명


 

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

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

codeup.kr


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

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

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

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


입력

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

출력

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

[입력 예시]

2 3

[출력 예시]

1 2 4
3 5 6

문제 풀이

기본적인 알고리즘의 로직을 세워보자.

이때 알고리즘은 1476의 로직을 응용한다.

 

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

난이도 ⭐️ ⭐️ ⭐️ ⭐️ 문제 설명 [기초-배열연습] 2차원 배열 빗금 채우기 3-1 다음과 같은 n*m 배열 구조를 출력해보자. 입력이 3 4인 경우 다음과 같이 출력한다. 1 3 6 9 2 5 8 11 4 7 10 12 입력이

udangtangtang-cording-oldcast1e.tistory.com

이전 생략

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

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

② temp_j 변수가 m보다 큰 지 확인한다.

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

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

 

1476의 문제와 조금 다른 점은 이번 문제는 위에서 아래로 사선을 그린다는 점이다.

따라서 출발지의 연산에서 j값이 먼저 선언되고 왼쪽 방향으로 가로가 줄고 세로는 증가하는 로직으로 가야 한다.

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

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

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

 

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

 

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

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

(3) 세로 인자의 최대 증가 시부터는 왼쪽 세로 이동을 위해 세로 이동 인자 i를 증가한다.

      이때 가로 인자는 while 반복문 전에 초기화되어야 한다.

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

⭐️⭐️⭐️
이 문제의 핵심은 일반적으로 n(i)을 기준으로 돌아가는 반복과는 다르게 j를 기준으로 루프가 돌아가는 것이다!
j는 대각선의 개수이며 이는 1 ~ n+m 이다.

정답 코드

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

int main(){
    int n,m,i=1,j=1,cnt=1;
    int dnum[100][100]={0};

    scanf("%d %d",&n,&m); //이중 배열 입력
    
    for(j=1;j<n+m;j++){
        /*
        n,m을 입력할 시에 대각선의 개수는 n+m-1이다.
        만약 4 4입력 시에는 대각선의 개수는 7개이며 1,2,3,4,5,6,7 순이다.
        */
       int tmp_j = j;
       if(tmp_j > m) {tmp_j = m;i ++;}
       /*
       반복 인덱스를 저장한 tmp_j는 대각선 처리에서 j부터 시작한다.
       
       이때 j가 m을 넘길시에는 즉, 
       m보다 밖에서 대각선을 할 수 없으므로 한계를 m으로 정한다.
       */
       int tmp_i = i;
       while(tmp_j>0){
        /*
        대각선의 시작은 0행에서 일반적으로 시작하며
        마지막 열에 대각선이 쳐질 경우 행을 하나 증가한다.
        */
            dnum[tmp_i][tmp_j] = cnt; cnt++;
            // printf("[%d][%d] ",tmp_i,tmp_j);
            tmp_j--;
            tmp_i++;
            
            if(tmp_i > n){break;}
            /*
            위의 조건이 제일 중요한데, 행을 나타내는 tmp_i가 n보다 커지면 반복 종료한다.
            
            위의 반복은 열을 수로 돌아가므로 행은 열을 조건을 하는 반복이
            끝날때까지 행의 수는 증가되기 때문이다.
            */
       } printf("\n");

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

    
} 
/*

*/
728x90
반응형
댓글