본문 바로가기
공부/c++

#4 배열 총 문제

by 심심한 뾰 2021. 8. 26.
반응형

/*이차원 배열과 포인터를 완전히 이해하기 위해 정리하는 마지막 개념이자 문제들이다.*/

 

#첫번째 문제

 

/*

100개 이하의 정수를 입력받아

첫 줄에 짝수 번째 숫자들을 순서대로 출력하고,

다음 줄에 홀수 번째 숫자들을 순서대로 출력하는 프로그램

 

7

3 1 4 1 5 9 2

 

출력

1 1 9

3 4 5 2

 

if 6

1 1 9

3 4 5

*/

 

- 내가 짠 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<iostream>
int main(){
  int arr[2][50];
  int num, num2;
  
  std::cin >> num;
 
  for(int i = 0; i < num; i++){
    std::cin >> num2;
    if((i % 2== 0){     //홀수번째 숫자
      arr[1][i/2= num2; 
    }
    else{                 //짝수번째 숫자
      arr[0][i/2= num2;
    }
  }
  
  for(int i = 0; i < num/2; i++){
    std::cout << arr[0][i] << " ";
  }
    std::cout << std::endl;
  if(num % 2 != 0){
    for(int i = 0; i < num/2+1; i++){
      std::cout << arr[1][i] << " ";
    }
  } 
  else {
    for(int i = 0; i < num/2; i++){
      std::cout << arr[1][i] << " ";
    }
  }
  std::cout << std::endl;
  
  //std::cout << *arr[1] << std::endl;
}
 
cs

 2차원 배열을 활용해 각 행에 홀수와 짝수번째 숫자들을 각각 따로 각 행에 저장하여, 출력을 한 코드이다.

 

- 영상에서 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
int main() {
  int n;
  int arr[105];
 
  std::cin >> n;
  for(int i = 0; i < n; i++){
    std::cin >> arr[i];
  }
 
  for(int i = 1; i < n; i+=2){
    std::cout << arr[i] << " ";
  }
  std::cout << std::endl;
  for(int i = 0; i < n; i+=2){
    std::cout << arr[i] << " ";
  }
}
 
 
cs

이 코드는 2차원 배열을 활용하지는 않고, 일차원 배열에 숫자들을 넣은 후, 출력할 때 한칸을 뛰어 넘은 후, 출력을 하게 한 코드이다.

 

 

#두번째 문제

/*

10*10 이하의 정수형 이차원 배열을 입력받아 그 배열이 각 행의 요소의 합을 출력하는 프로그램 만들기

 

3 4

4 2 6 3

7 9 3 4

5 1 2 1

 

출력 예

15

23

9

*/

 

- 내가 짠 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<iostream>
 
int main(){
  int row,col,n,sum=0;
  std::cin >> row >> col;
 
  int arr[row][col];
  for(int i = 0; i < row; i++){
    for(int j = 0; j < col; j++){
      std::cin>>n;
      arr[i][j] = n;
    }
  }
 
  for(int i = 0; i < row; i++){
    for(int j = 0; j < col; j++){
      sum+=arr[i][j];
    }
    std::cout << sum << std::endl;
    sum = 0;
  }
}
cs

 이 코드는 이차원 배열을 정의한 후, 값을 입력 받고,

for문을 사용해 각 행의 요소들의 합을 출력한 코드이다.

*이차원 배열에서 행과 열이 헷갈릴 땐, 열 쇠로(세로)~~!!를 기억하자*

 

 

-영상에서 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<iostream>
 
int main(){
  int n,m;
  int arr[12][12];
 
  std::cin >> n >> m;
  for(int i = 0; i < n; i++){
    for(int j = 0; j < m; j++){
      std::cin >> arr[i][j];
    }
  }
 
  for(int i = 0; i < n; i++){
    int sum = 0;
    for(int j = 0; j < m; j++){
      sum += arr[i][j];
    }
    std::cout << sum << std::endl;
  }
}
 
cs

 영상에서의 코드도 내가 짠 코드와 비슷하다.

 

 

#이차원 배열을 이해하기 더욱 쉽게 만들 개념

- 이차원 배열의 주소값

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<iostream>
 
int main(){
  using namespace std;
  int arr[3][3= {0};
 
  cout << &arr << endl;         //2차원 배열 전체를 가리키는 포인터
  cout << arr << endl;
  cout << *arr << endl;
  cout << &arr[0<< endl;
  cout << arr[0<< endl;
  cout << *arr[0<< endl;
  cout << &arr[0][0<< endl;
  cout << arr[0][0<< endl;  
 
  //&arr == arr == *arr == &arr[0] == arr[0] == &arr[0][0]
  // *arr[0] == arr[0][0]
}
 
cs

&arr, arr, *arr, &arr[0], arr[0], &arr[0][0] 은 모두 arr[0][0]의 주소값을 가르키고,

*arr[0], arr[0][0]은 모두 arr[0][0]의 값을 가리킨다.

 

&arr은 배열 전체를 가리키는 때문에 출력은 배열의 첫 요소의 주소값을 출력한다.

배열의 첫 요소의 주소값은 arr[0][0]의 주소값이다.

 

arr은 &arr[0]과 같기에 첫행을 가리키고, 출력은 행의 첫 요소의 주소값을 출력한다.

행의 첫요소의 주소값은 arr[0][0]의 주소값이다.

 

*arr은 arr[0]과 같은 의미로 arr[0]의 첫 요소인 arr[0][0]의 주소값을 가르킨다.

 

arr[0]는 &arr[0][0]와 같고, arr[0][0]의 주소값을 출력한다.

 

&arr[0][0]은 arr[0][0]의 주소값을 불러오는 것이므로 arr[0][0]의 주소값을 출력한다.

 

*arr[0] *(&arr[0][0])과 같으므로, arr[0][0]의 값이 출력된다.

 

arr[0][0]은 arr[0][0]에 들어 있는 값이 출력된다.

 

 

- 이차원 배열의 주소값

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<iostream>
 
int main(){
  using namespace std;
  int arr[3][3= {0};
  //int 4바이트
  cout << &arr[0][0<< endl;   //100
  
  cout << arr[0+ 1 << endl;   //104
  cout << &arr[0+ 1 << endl;  //112
  cout << arr + 1 << endl;      //112
  cout << &arr + 1 << endl;     //136
}
 
cs

arr[0][0]의 주소값은 100으로 가정한다.

&arr[0][0]은 이차원 배열의 첫 행의 첫 열의 요소의 주소값을 나타낸다. 

따라서, 주소값에 1을 더한다면 int형이기에 4byte가 더해져 주소값은 104가 된다.

 

&arr[0]은 이차원 배열의 첫 행의 주소값을 나타낸다.

따라서, 주소값에 1을 더한다면 첫행이 3개의 int형 요소를 포함하기에 12byte가 더해져 주소값은 112가 된다.

arr은 &arr[0]과 같기 때문에 주소값에 1을 더하면 주소값은 112가 된다.

 

&arr은 이차원 배열 전체의 주소값을 나타낸다. 

따라서, 주소값에 1을 더하면 이차원 배열이 행 3개, 열 3개 총 9개의 요소를 포함하고 있기에, 36byte가 더해져 주소값은 136이 된다.

 

 

- 이 코드는 오류가 난다. 틀린 이유는?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<iostream>
 
int main(){
  using namespace std;
  int arr[3][4= {
    {1,2,3,4},
    {5,6,7,8},
    {9,10,11,12}
  };
 
  int (*ptr)[4= arr; //이 포인터를 2차원 배열처럼 쓸 수 있음
 
  for(int i = 0; i < 3; i++){
    for(int j = 0; j < 4; j++){
      cout << *ptr[i][j] << endl;
    }
    // *만 지우면 출력됨
    cout << endl;
  }
}
 
/*
원하는 출력
1 2 3 4
5 6 7 8
9 10 11 12
*/
 
cs

int (*ptr)[4] = arr;

을 통해 ptr을 이차원 배열로 쓸 수 있다.

따라서 출력할 때, *ptr[i][j]에서 *를 지운 ptr[i][j]를 오류없이 출력할 수 있다.

 

 

출처(source) - 유튜브 두들낙서님

https://www.youtube.com/c/%EB%91%90%EB%93%A4%EB%82%99%EC%84%9C

 

두들낙서

C/C++ 강좌를 올리고 있고 다른 컨텐츠는 할 수도 있고 안 할 수도 있는 채널. ▶ 두들낙서 지식공유 서버 참가하기: https://discord.gg/y4SXcjU

www.youtube.com

c++ 최고의 강좌,,

 

반응형