본문 바로가기
CodeUp 기초 100제/C

CodeUp[코드업] C언어 1096 ~ 1099 : [기초 - 2차원 배열]

by En_Geon 2019. 12. 9.

1096 : [기초 - 2차원 배열] 바둑판에 흰 돌 놓기

문제 설명 : https://codeup.kr/problem.php?id=1096

 

흰 돌이 올려진 바둑판의 상황을 출력하는 문제다.

 

  • 2차원 배열을 배운다

2차원 배열의 선언

타입 변수 이름 [ ][ ] = { };

 

2차원 배열은 테이블 형태의 데이터를 담는 데 사용된다.

 

  3열
4행 0 0 0
0 0 0
0 0 0
0 0 0

int x[4][3] = { 0 };을 수행한 배열은 이렇게 나온다.

 

더보기

 

#include    <stdio.h>

int main()
{
    int i, j, x, y, input = 0;
    int a[20][20] = { 0 };        // 2차원 배열 20행(0 ~ 19) 20열(0 ~19)을 만든다. 
    scanf("%d", &input);   // 몇 개를 놓을지 입력 받음 
    
    for(i = 1; i <= input; i++)   // input개만큼 놓음
    {
        scanf("%d %d", &x, &y);  // 2차원 배열은 좌표 형태로 표현 가능
        a[x][y] = 1;        // 흰 돌이 있는 위치는 1, 없는 위치는 0
    }
    
    for(i = 1; i <= 19; i++)      // 2차원 배열을 출력하기 위해서는 중첩 for문을 사용함
    {
        for(j = 1; j <= 19; j++)
            printf("%d ", a[i][j]);
        
        printf("\n");
    }
    return 0;
}

 

/* 1081에 중첩 for문에서 말했던 첫 번째 for문이 고정된다는 것을 알고 있으면 2차원 배열이

어떻게 출력되는지 어떻게 저장되는지를 쉽게 이해할 수 있다.*/

 

1097 : [기초 - 2차원 배열] 바둑알 십자 뒤집기

문제 설명 : https://codeup.kr/problem.php?id=1097

 

바둑알을 십자로 뒤집는 문제다.

 

더보기

 

#include     <stdio.h>

int main()
{
    int i, j, x, y, input = 0;
    int a[20][20] = { 0 };        // 20행(0~19) 20열(0~19) 배열을 선언
    
    for(i = 1; i <= 19; i++)        // 한 줄씩 바둑판 상황 입력 받음
        for(j = 1; j <= 19; j++)
        {
            scanf("%d", &a[i][j]);
        }
        
    scanf("%d", &input);            // 좌표 개수 입력 받음
    
    for(i = 1; i <= input; i++)     // 좌표 개수만큼 
    {
        scanf("%d %d", &x, &y);    // 좌표를 받음
        
        for(j = 1; j <= 19; j++)    // 가로줄 흑 백 바꾸기
            if(a[x][j] == 0)
                a[x][j] = 1;
            else
                a[x][j] = 0;
        
        for(j = 1; j <= 19; j++)    // 세로줄 흑 백 바꾸기
            if(a[j][y] == 0)
                a[j][y] = 1;
            else
                a[j][y] = 0;
    }
    
    for(i = 1; i <= 19; i++)         // 바뀐 바둑판 출력
    {  
        for(j = 1; j <= 19; j++)
            printf("%d ", a[i][j]);
        
        printf("\n");
    }    
    return 0;
}

 

1098 : [기초 - 2차원 배열] 설탕과자 뽑기

문제 설명 : https://codeup.kr/problem.php?id=1098

 

설탕과자 뽑기를 코드로 바꾸는 문제다.

 

이 문제는 한 번에 이해하기가 정말 어렵다. 본인은 많은 구글링과 지인들에게 물어본 후 이해할 수 있었다.

어렵게 이해한 만큼 주석이 하나하나 자세히 적었다.

 

1081에서 중첩 for문이 고정된다는 의미를 여기서 완벽하게 파악하였다.

 

더보기

 

#include      <stdio.h>

int main()
{
    int h, w, n, l, i , j , d, x, y;

  // h = 세로, w = 가로, n = 막대 개수, l = 막대 길이, d = 0 가로, 1 세로, x , y = 좌표
    int a[101][101] = { 0 };
    scanf("%d %d", &h, &w);     // 판의 넓이
    
    scanf("%d", &n);    // 막대 개수
    
    for(i = 1; i <= n; i++) // 막대 개수만큼
    {
        scanf("%d %d %d %d", &l, &d, &x, &y);
        if(l==1)    // 막대 길이가 1일 때
        {
            if(a[x][y]==0)  // x, y 좌표가 0이면
                a[x][y] = 1;   // x, y 좌표의 값을 1로 바꿈
        }
        
        if(l!=1)    // 막대 길이가 1이 아닐 때
        {
            if(d == 0)      // 가로로 놨을 때
            {
                for(j = 1; j <= l; j++)
                    a[x][y + j - 1] = 1;     // 세로(행) 고정후 가로(열)를 바꿈 
            }            // 특히 이 부분 왜 -1을 하는지에 대해서 이해하기 어려웠다 

                        // 처음 좌표가 1,1 이기 때문에 j가 2가 되면 1,3이 되기 때문에 -1 해서
                        // 두 번째 좌표가 1,2가 될 수 있도록 함
            else if(d == 1)     // 세로로 놨을 때
            {
                for(j = 1; j <= l; j++)
                    a[x + j - 1][y] = 1;    // 가로(열) 고정후 세로(행)를 바꿈
            }       
        }
    }
    
    for(i = 1; i <= h; i++)         // 배열 a를 h * w 크기로 출력
    {   
        for(j = 1; j <= w; j++)
        { 
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }
    return 0;
}

 

1099 : [기초 - 2차원 배열] 성실한 개미

문제 설명 : https://codeup.kr/problem.php?id=1099

 

개미의 이동 경로를 표시하는 문제다. 

 

개미의 이동 경로를 표시하고 개미는 이동하는 방식이 문제 설명에 있다.

기초 마지막 문제답게 어려운 종합문제다.

 

이 문제도 1098문제와 같이 이해하기 힘들었다.

이해하기 어려운 문제는 코드가 어떻게 지나가는지를 주석을 통해 자세히 설명한다.

이 문제는 지금까지 풀이한 문제들의 종합 문제이기 때문에 한 줄 한 줄 이해해야 완벽히 이해할 수 있었다.

 

더보기

 

#include  <stdio.h>

int main()
{
    int i, j, x = 2, y = 2;
    int a[11][11] = { 0 };
    
    for(i = 1; i <= 10; i++)        // 미로 판의 상황
        for(j = 1; j <= 10; j++)
            scanf("%d", &a[i][j]);  // 10 * 10의 미로 상자
            
    while(a[x][y] != 2)     // a[x][y]의 값이 2가 아닐 때까지 반복
    {
        a[x][y] = 9;        // a[x][y]의 값이 2가 아니면 a[x][y]에 9를 넣음
        if(a[x][y + 1] != 1)        //오른쪽으로 이동한 값이 1이 아니면 오른쪽(열 이동)으로 이동
            y += 1;
        else if(a[x + 1][y] != 1)   // 아래로 이동한 값이 1이 아니면 아래(행 이동)로 이동
            x += 1;
        else break;     // 위 if문이 모두 거짓일 때 반복문 탈출
    }
    
    a[x][y] = 9;        // 반복문이 끝난 자리의 값을 9로 바꿈
    
    for(i = 1; i <= 10; i++)        // 배열 a를 10 * 10 크기로 출력
    {   for(j = 1; j <= 10; j++)
            printf("%d ", a[i][j]);
        
        printf("\n");
    }        
    return 0;
}

댓글