C++ - 2차배열 / 동적할당 패턴 연습 (+입력 정리, vector 인자로 넘길때)

2022. 8. 19. 11:22STUDY/C++

반응형

입출력하고 배열에 우선 익숙해져야겠다..... 

1. 

cin / cout 을 쓰는걸로하자. 

cin / cout 은 C++ 의 String 을 쓸수있다. 근데  printf/scanf는 저걸 못씀.

대신, cin / cout 쓰려면 조건이 몇가지 있다. 

ios::sync_with_stdio(0);  // C++ stream과 C stream의 동기화를 끊어서 프로그램 수행시간 늘리도록 하는기능. 
cin.tie(0);   // cin 명령을 수행하기 전에 cout 버퍼를 비우지 않도록 하는 코드. 

이 2개를 같이 써야함. 

입출력이 작을때는 상관없지만, 양이 많을때 ( 출력 100만번 /  입력 100만번 ) 지연되어 시간초과 발생할 수 있다.

그리고 , 이걸 쓸때 cin / cout 하고, printf / scanf 같이 쓰면 안된다. 

 

2.

공백이 포함된 문자열을 받을 때, 단순히 scanf 나 cin 을 쓰면 안된다. 

공백 포함한 문자열을 입력 받을때는 getline(cin, s ) 를 사용해 입력받는다.

3.

실수형 문제는 그냥 double 을 쓰자.

4.

헤더는 #include <bits/stdc++.h> 를 쓰자......? 

5.

30분 - 1시간 고민해도 실마리가 전혀 보이지않으면 그냥 빠르게 풀이를 참고해서 내것을 만들자. 대신 다시 풀어봐야함. 

만약 풀이법을 봐도 모르겟으면, 그냥 과감하게 다른걸로 넘어가자.

6.

STL vector 를 함수 인자로 넘길때. 이렇게 하면 O(1)이 된다. 위에건 copy, 아래는 참조형식. 

1
2
3
4
5
6
7
8
bool cmp1 (vector<int> v1, vector<int> v2, int idx) {
    return v1[idx] > v2[idx];
}
 
bool cmp2 (vector<int>& v1, vector<int>& v2, int idx) {
    return v1[idx] > v2[idx];
}
 
cs

7.

배열 초기화 TIP.

memset은 비추. 

for 로 일일히 0으로 초기화하는건 걍 무난 . 하지만 fill 함수 쓰는게 더 익숙해지도록 ! 

1
2
3
4
5
6
7
8
9
10
 
// FILL 
int a[21];
int b[21][21];
 
fill(a, a+210);
for(int i = 0; i < 21; i++)
    fill(b[i], b[i]+210);
 
 
cs

 


# 2차원 배열 선언 및 초기화. 

1. 

2차원 배열을 매개변수로 전달 받을 때는, col 크기를 지정해줘야한다. 적어도! 

위와같이, 행의 크기만 넘기면 각 행이 몇개의 원소를 갖고있는지 모르는데,

열의 크기를 지정하면 행의 크기는 컴파일러가 알아서 유추 할 수 있기 때문이다. 

 

2. 

row (열), col (행). 

row  =  sizeof(arr) / sizeof(arr[0]); // 배열전체 size / 한 행의 크기 
col = sizeof(arr[0])/ sizeof(int) // 한 행의 크기 / 자료형 크기 

 

3. 

이중포인터를 이용한 2차원 배열 동적할당 하는 방법. 

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
37
38
39
40
41
42
43
44
45
46
// Example program
 
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
 
int main()
{
    int n, m;
    cin >> n >> m;
    // if... n : 2, m : 5
    
    // 2 차원 배열 선언
    int **= new int* [n]; // n 개의 행.
    for(int i =0 ; i < n; i++) {
        p[i] = new int[m]; // m 개의 열.
    }
    
    // 2차원 배열 초기화
    for(int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            int x; cin >> x;
            p[i][j] = x;
        }
    }
    
    // 출력 
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < m; j++) {
            cout << p[i][j] << " ";
        }
        cout << '\n';
    }
    
    // 동적 할당 해제
    for(int i =0; i < n; i++// n개의 행. 
        delete[] p[i]; // 한 행을 가리키는 포인터. n번만큼 해제. row 해제. 
    delete[] p; // 배열 전체를 가리키는 포인터. 열 해제후 전체 해제.
    
 
    return 0;   
}
 
cs

 

4. 

Vector 로 2 차원 배열 선언 및 초기화 ! 

( new / delete 를 알아서 처리해준다. 확실히 일반 배열보다 편하다. 해제해줄 필요가 없음. 

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
37
38
39
40
41
42
43
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
// vector<int> v(10,0); // 10개의 원소를 0으로 초기화.
// vector<vector<int> > v(10, vector<int>(10,0)); // 10개의 원소를, 또 다시 vector 로 초기화. 
 
int main()
{
    int n, m;
    cin >> n >> m;
    // if... n : 2, m : 5
    
    // 0으로 초기화 된 n행 m열.
    vector<vector<int> > vv( n, vector<int>(m, 0));
    
    // 2차원 배열 초기화
    for(int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            int x; cin >> x;
            vv[i][j] = x;
        }
    }
    
    // 출력 
    for(vector<int> v : vv) {
        for(int element : v) 
            cout << element << ' ';
        cout << '\n';
    }
    
    /*
    for(auto v : vv) {
        for(auto element : v)
            cout << element << ' ';
        cout << '\n';
    }
    */
 
    return 0;   
}
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
// vector<int> v(10,0); // 10개의 원소를 0으로 초기화.
// vector<vector<int> > v(10, vector<int>(10,0)); // 10개의 원소를, 또 다시 vector 로 초기화. 
 
int main()
{
    vector<vector<int> > vv;
    vector<int> v;
    vv.push_back(v);
 
    vv[0].push_back(7);
    cout << vv[0][0<< '\n'// 7 이 출력됨. 
 
    return 0;   
}
cs

 

 

https://velog.io/@jxlhe46/2%EC%B0%A8%EC%9B%90-%EB%B0%B0%EC%97%B4-%EB%B3%B5%EC%8A%B5

 

[C++] 2차원 배열 복습

정적 배열, 동적 배열 (이중 포인터 or 벡터 사용)

velog.io

 

728x90
반응형