2차원 배열

문성원·2024년 1월 4일
0

1) 목표

  • 2차원 배열의 개념에 대해서 살펴보기
  • 차원 변환 공식의 원리에 대해서 살펴보기
  • 2차원 배열의 문제점에 대해서 살펴보고 이를 어느 정도 해결할 수 있는 방안 찾아보기

2) 소스 코드

// Visual Studio 2022 x86(32비트) 기준 
// 2차원 배열

#include "pch.h"
#include <stdio.h>      // printf 함수를 사용하기 위해

int main()
{
    // 1차원 배열 선언 -> 그룹 짓는 기준이 1가지인 것
    char data[6] = { 10, 11, 12, 13, 14, 15 };
    // 2차원 배열 선언 -> 그룹 짓는 기준이 2가지인 것
    // 2 * 3 형태의 2차원 배열(x그룹: 2, y그룹: 3)
    // 시작 좌표는 (0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)
    // c언어가 2차 표기를 쉽게 하도록 만들어 준 것(컴파일 시 1차로 다시 바꿈)
    // 2차원 배열로 메모리를 관리할 때 선상에서 동일하게 관리하는 쪽이 훨씬 더 쉬우므로 보통 [y][x]로 많이 쓴다.
    // 2차원을 1차원으로 다시 생각할 때 자릿수 진법 계산을 생각하면 됨
    // 여기 2차원 배열에서 3항목이 끝나면 다른 그룹으로 넘어감
    // 따라서 그룹 식: 1 * 3 + 2
    char temp[2][3] = { {10, 11, 12}, {13, 14, 15}  };
    // group_id -> y, index -> x
    char temp_array[3][2] = { {10, 11}, {12, 13}, {14, 3} };
    
    // 배열 값들의 합을 구해보기(그룹 짓는 항목이 1개)
    int sum1 = data[0] + data[1] + data[2] + data[3] + data[4] + data[5];
    sum1 = 0;
    for (int i = 0; i < 6; ++i)
        sum1 += data[i];
    printf("%d\n", sum1);
    
    
    int sum2 = temp[0][0] + temp[0][1] + temp[0][2]
        + temp[1][0] + temp[1][1] + temp[1][2];
    sum2 = 0;
    for (int y = 0; y < 2; ++y) {
        for (int x = 0; x < 3; ++x) {
            sum2 += temp[y][x];
        }
    }
    printf("%d\n", sum2);

    int sum3 = temp_array[0][0] + temp_array[0][1] + temp_array[1][0]
        + temp_array[1][1] + temp_array[2][0] + temp_array[2][1];
    sum3 = 0;
    for (int y = 0; y < 2; ++y) {
        for (int x = 0; x < 2; ++x) {
            sum3 += temp_array[y][x];
        }
    }
    printf("%d\n", sum3);


    sum2 = 0;
    // 그룹을 1개로 지어서 temp[0][0] ~ temp[0][5] 이렇게 표현
    // 하지만 쓸데 없이 반복할 때마다 0을 곱하기에 메모리에 쓸데 없는 낭비
    for (int i = 0; i < 6; ++i)
        sum2 += temp[0][i];
    printf("%d\n", sum2);
    for (int i = 0; i < 6; ++i)
        sum3 += temp_array[0][i];
    printf("%d\n", sum3);

    // 차원 공식
    // 요구 기준: 2차 -> 1번 그룹, 2번 항목에 3을 대입(2차 -> 1차)
    // group_id, index, num -> temp[group_id][index] = num;
    //                      -> data[group_id * 3 + index] = num;
    
    // 요구 기준: 1차 -> 5번 항목에 3을 대입(1차 -> 2차)
    // index, num  -> data[index] = num;
    //             -> temp[index/3][index%3] = num;
    
    // 프로그램 종료
    return 0;
}

3) 이해한 내용 정리

  • 2차원 배열은 모니터 화면이나 여러 변칙들이 존재하는 상황을 가정했을 때, c언어에서 제공해주는 표현식이다.
  • 1차원 배열과 달리 2차원 배열은 계산식이 훨씬 더 복잡하기에 메모리 효율성을 따졌을 때 1차원을 사용하는 것이 낫다.
  • 배열에서의 차원 변환 공식은 다음과 같다.
// 1번 그룹의 2번 항목에 5를 대입하라
// 개발자가 선언한 배열은 1차원이다.
char temp[1][2] = 5;
// group_id(y) * 3(원소 개수) + index(x)
char data[1 * 3 + 2] = 5;
char data[5] = 5;

// 4번 항목에 4를 대입하라.
// 개발자가 선언한 배열은 2차원이다.
char data[4] = 4;
// index / 3(원소 개수) -> group_id
// index % 3(원소 개수) -> index
char temp[6 / 3][6 % 3]
char temp[2][0] = 4;
  • 2차원 배열을 선언하고 이를 반복문으로 돌려서 값을 출력할 때에는 한 그룹을 0으로 선언한 다음, 다른 그룹에 반복할 횟수를 대입하면 된다.
sum2 = 0;
for(int y = 0; y < 6; ++y)
{
	sum += temp[0][i];
}

4) 출처

본 게시글은 금배씨 영상 중 "2차원 배열"을 참조하여 작성되었습니다.

profile
EasyWin32를 통해 C언어를 공부하고 있습니다~

0개의 댓글

관련 채용 정보