배열(Array) - (1)

@Super_E끌림·2024년 5월 25일
post-thumbnail

⛅️오늘의 이야기

  • 1차원 배열 vs 2차원 배열 <--- 이번 내용

  • 배열의 자료형 : char vs int





📌들어가기 전에..

이 내용은 c언어 기반의 내용으로 설명한다는 점 참고!

그리고 여기서는 배열의 기초도 설명하겠지만 위에 있는 내용들에 초점을 둘거라

기초를 알고 보시는게 도움이 더 될겁니다.

array size set / array index 딸랑 이거 2개 정도?





본격적으로 내용에 들어가보겠습니다.





💁🏻‍♂️ 1차원 배열 vs 2차원 배열

이 두 개의 배열은 어떤 차이가 있을까요?

바로 차원이 다릅니다.

이는 수학적 차원하고 똑같습니다.

그래프적으로 설명해보면

1차원 배열 : X축(행) / 2차원 배열 : X축(열), Y축(행)



  • 1) 정의

    이걸 c언어로 나태내면 아래와 같이

    #include <stdio.h>
    
    int main(){
    		int arr[x]; //1차원 배열
    		char arr[x][y]; //2차원 배열
    }

    정의할 수 있습니다.

    생각보다 간단합니다.



    지금은 배열이름 앞에 자료형은 신경쓰지 말자!!!


    정의의 또 다른 형태로 저장 방법이 있습니다.


    바로 정의와 동시에 데이터를 입력하는 방법이 존재합니다.

    이는 대부분 scanf를 통해 입력 받지 않을 때 사용하긴 합니다.

    #include <stdio.h>
    
    int main(){
    		int arr[x]={data_1, data_2, ...}; // 1차원 배열
    		char arr[x][y]={{data_1, data_2, ...}, {data_3, data_4, ...}, ...}; // 2차원 배열
    }

    2차원 배열은 중괄호를 기준( {data_1, data_2, ...} )으로 1개의 열을 의미합니다.

    입력 : x = 4

               y = 6

배열은 배열의 크기 지정이 가장 중요합니다.

이 크기에 따라 값을 넣을 수 있는 갯수가 정해지기 때문입니다.

그리고 또한 입출력과도 관계가 깊기 때문에도 중요!(array index)

자꾸 array index를 말하는데 이 개념이 배열의 50%이상을 차지합니다.




  • 2)scanf로 데이터 입력

    2차원 배열의 데이터를 입력하는 방식은 2가지 방법이 있습니다.


    먼저 1차원 배열의 입력방법을 알아보겠습니다.



    2-1) 1차원 배열

    • 1) 문자( char )로 입력받기

    • #include <stdio.h>
      
       int main(void){
          int x;
          scanf("%d",&x); // 배열 크기 지정
          char arr[x];
      
          // 배열 데이터 입력
          
          // i의 값은 상황에 따라 달라지지만 대부분 처음에는 0부터 시작
          // 1) 문자열 입력받기 
          for(int i=0;i<x;i++){
              scanf("%c",arr[i]);
          }
          
          // 2) 문자 입력받기
          scanf("%c",arr[i]);
       }

      for문을 이용해서 문자 ---> 문자열처럼 저장이 가능합니다.

      음.. 근데 문자열을 저장하고 싶으면 2번째 방식으로 입력하는게 더 효율적입니다.




    • 2) 문자열( string )으로 입력받기

    •  #include <stdio.h>
      
        int main(void){
           int x;
           scanf("%d",&x); // 배열 크기 지정
           char arr[x];
      
           // 배열 데이터 입력
           
           // i의 값은 상황에 따라 달라지지만 대부분 처음에는 0부터 시작
           scanf("%s",arr[i]);
        }

      저장되는 방법은 똑같지만

      위의 방법과 다른점은 문자열 ---> 문자열처럼 저장한다는 것 입니다.


      이게 뭔말이야 싶으시면 다음에 자료형 비교에서 더 자세히 말하겠으니 그냥 넘어가십시요!



    2-2) 2차원 배열

    여기도 위와 별다른 차이는 없지만 2차원으로 배열의 크기를 지정하는 변수가 2개로 늘어난 것 뿐입니다.


    • 1) 문자( char )로 입력받기

    • #include <stdio.h>
      
       int main(void){
          int x,y;
          scanf("%d %d",&x,&y); // 배열 크기 지정
          char arr[x][y];
      
          // 배열 데이터 입력
          
          // i 와 j 값은 상황에 따라 달라지지만 대부분 처음에는 0부터 시작
          // 문자열 입력받기
          for(int i=0;i<x;i++){
          	for(int j=0;j<y;j++){
          		scanf("%c",arr[i][j]);
              }
          }
          
          // 2) 문자 입력받기
          scanf("%c",arr[i][j]);
       }

      배열의 크기를 지정하는 변수가 2개 이므로 2중 for문을 통해 문자를 입력해야 합니다.



    • 2) 문자열( string )로 입력받기

    • #include <stdio.h>
      
       int main(void){
          int x;
          scanf("%d",&x); // 배열 크기 지정
          char arr[x];
      
          // 배열 데이터 입력
          
          // i 와 j 값은 상황에 따라 달라지지만 대부분 처음에는 0부터 시작
          scanf("%s",arr[i][j]);
          
          // j를 0으로 놓고 입력받기
          scanf("%s",arr[i][0]);
          
          // j를 0으로 놓고 여러번 입력받기
          for(int i=0;i<x;i++){
          	scanf("%s",arr[i][0]);
          }
       }

      문자열을 저장할때 2중 for문을 쓰는 것보다

      아예 행을 값(상수)로 지정해주면 for문 1개를 써도 충분합니다.

      왜냐하면 위에서도 말했듯이 문자로 입력하든 문자열로 입력하든 문자로 저장되기 때문입니다.




  • 3)데이터 출력된 모습 보기

    배열의 출력은 입력받는 형식과 거의(?) 똑같은 코드다.

    그래서 코드는 쓰지 않겠습니다.

    scanf ---> printf로만 바꾸면 배열에 저장된 데이터를 출력할 수 있습니다.



    3-1) 2차원 배열의 출력에 대한 오해

    이걸 왜 오해라고 예기하냐면 컴퓨터는 멍청합니다.(연산만 겁나 잘하고 빠른 장치)

    컴퓨터가 2차원 배열이라고 해서 진짜 이렇게

    출력이 되는게 아니라 1차원 배여처럼 출력이 됩니다.

    그래서 2차원처럼 출력하고 싶으면

    for(int i=0;i<x;i++){
         	for(int j=0;j<y;j++){
         		scanf("%c",arr[i][j]);
            }
            // 추가
            printf("\n");
     }

    줄바꿈 이스케이프 문자를 추가해주면 됩니다!






🫧 마무리

여기 있는 코드들은 입출력에 대한 방법을 최대한 많은 알려드리기 위해서 썼습니다.

다음에는 배열의 자료형에 따라 저장되는 방법에 대해 알려드리겠습니다.





profile
SoC:) SoC:)

2개의 댓글

comment-user-thumbnail
2024년 5월 27일

c 에서 배열은 포인터의 형태로 많이 다룬답니다!
n차원 배열은 n차원 포인터의 형태로 표현 할 수 있어요.

List<int> => int*
List<List<int> => int**

이렇게 선언하면, 동적 크기의 배열로서 다룰 수 있다는 장점이 있죠.

해당 내용에 대한 설명도 추가되면 더 좋은 포스트가 될 것 같네요~

1개의 답글