함수에서 값 리턴 (int f() ) | 함수에서 참조자 리턴 (int& f() ) | |
---|---|---|
값 타입으로 받음 (int a = f() ) | 값 복사됨 | 값 복사됨, 다만 지역 변수의 레퍼런스를 리턴하지 않도록 주의 |
참조자 타입으로 받음 (int& a = f() ) | 컴파일 오류 | 가능, 다만 위와 같이 지역 변수의 레퍼런스를 리턴하지 않도록 주의 |
상수 참조자 타입으로 받음 (const int& a = f() ) | 가능 | 가능, 다만 위와 같이 지역 변수의 레퍼런스를 리턴하지 않도록 주의 |
+) 원래 변수 없이 참조자만 남게 되는 경우, 그것을 댕글랭 레퍼런스라고 함 ! 발생하지 않도록 유의
new : 메모리 할당 (C언어의 malloc)
int* pointer = new int; // 임의의 타입 할당 가능
int* list = new int[arr_size]; // 배열 할당
delete : 메모리 해제 (C언어의 free)
delete pointer; // 사용자가 new를 통해 할당한 공간만 해제 가능
delete[] list; // 배열 해제
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main(void)
{
int n;
cin >> n;
stack<int> st;
for (int i = 0; i < n; i++)
{
string str;
cin >> str;
if (str == "push")
{
int num;
cin >> num;
st.push(num);
}
else if (str == "pop")
{
if (!st.empty())
{
cout << st.top() << endl;
st.pop();
}
else
cout << "-1" << endl;
}
else if (str == "size")
cout << st.size() << endl;
else if (str == "empty")
{
if (st.empty())
cout << "1" << endl;
else
cout << "0" << endl;
}
else if (str == "top")
{
if (!st.empty())
cout << st.top() << endl;
else
cout << "-1" << endl;
}
}
return 0;
}
#include <iostream>
#include <queue>
#include <string>
using namespace std;
int main(void)
{
int n;
cin >> n;
queue<int> q;
for (int i = 0; i < n; i++)
{
int num;
string str;
cin >> str;
if (str == "push")
{
cin >> num;
q.push(num);
}
else if (str == "pop")
{
if (q.empty())
cout << -1 << '\n';
else
{
cout << q.front() << '\n';
q.pop();
}
}
else if (str == "size")
cout << q.size() << '\n';
else if (str == "empty")
cout << q.empty() << '\n';
else if (str == "front")
{
if (q.empty())
cout << -1 << '\n';
else
cout << q.front() << '\n';
}
else if (str == "back")
{
if (q.empty())
cout << -1 << '\n';
else
cout << q.back() << '\n';
}
}
return 0;
}
#include <iostream>
#include <queue>
using namespace std;
queue<pair<int, int>> q;
int n, m, k;
int cabbage[50][50];
bool visit[50][50];
int dx[] = { -1, 0, 1, 0 };
int dy[] = { 0, -1, 0, 1 };
void bfs(int xx, int yy)
{
q.push({ xx,yy });
while (!q.empty())
{
int x = q.front().first;
int y = q.front().second;
q.pop();
visit[x][y] = true;
for (int i = 0; i < 4; i++)
{
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && ny >= 0 && nx < n && ny < m && !visit[nx][ny] && cabbage[nx][ny] == 1)
{
visit[nx][ny] = true;
q.push({ nx,ny });
}
}
}
}
void init(void)
{
while (!q.empty())
q.pop();
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
{
visit[i][j] = false;
cabbage[i][j] = 0;
}
}
int main(void)
{
int t;
cin >> t;
for (int i = 0; i < t; i++)
{
init();
cin >> m >> n >> k;
int cnt = 0;
for (int i = 0; i < k; i++)
{
int x, y;
cin >> y >> x;
cabbage[x][y] = 1;
}
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (cabbage[i][j] == 1 && !visit[i][j])
{
bfs(i, j);
cnt++;
}
cout << cnt << '\n';
}
return 0;
}
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
int main(void)
{
int n, tmp, mean, mode = 0;
int min, max = 0;
bool is_second = false;
cin >> n;
vector<int> vec(n);
vector<int> vec2(8001, 0);
for (int i = 0; i < n; i++)
{
cin >> vec[i];
mean += vec[i];
tmp = (vec[i] <= 0) ? abs(vec[i]) : vec[i] + 4000;
vec2[tmp]++;
if (vec2[tmp] > max)
max = vec2[tmp];
}
sort(vec.begin(), vec.end());
for (int i = -4000; i < 4001; i++)
{
tmp = i <= 0 ? abs(i) : i + 4000;
if (vec2[tmp] == max)
{
mode = i;
if (is_second)
break;
is_second = true;
}
}
cout << round(mean / (double)n) << '\n';
cout << vec[round(n / 2)] << '\n';
cout << mode << '\n';
min = vec[0];
max = vec[vec.size() - 1];
cout << max - min << '\n';
return 0;
}