2022. 8. 19. 11:22ㆍSTUDY/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+21, 0);
for(int i = 0; i < 21; i++)
fill(b[i], b[i]+21, 0);
|
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 **p = 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
'STUDY > C++' 카테고리의 다른 글
unordered_map vs map in C++ (2) | 2022.08.22 |
---|---|
C++ min , max, index 구하기 (1) | 2022.08.21 |
(C++) vector - accumulate, clear/erase, unique(+sort) (0) | 2022.08.18 |
C++ - vector of pairs / vector of vectors (1) | 2022.08.09 |
C++ - pair ( aka. vector / typedef / sort ) (1) | 2022.08.08 |