알고리즘 문제풀이의 거의 최강자, cpp을 알아보도록 하겠다.
#include <iostream>
#include <string>
using namespace std;
int main () {
string munjayeol;
cin >> munjayeol; // 이렇게 입력 가능. 띄어쓰기나 엔터가 있을 때마다 하나의 변수에 들어감
int jungsu;
cin >> jungsu; // 입력하는 변수의 타입에 따라 자동으로 바꿔서 입력시켜줌. 보이는 것 처럼 정수 가능
int num1, num2, num3;
cin >> num1 >> num2 >> num3; // 이렇게 한 번에 여러개 입력 가능. 1 2 3 입력하면 변수에 차례대로 num1 = 1, num2 = 2... 이렇게 들어가는거임
cout << "hello, world\n"; // 출력은 이렇게 하면 됨
cout << num1 + num2 << "\n"; // 입력처럼 다른 타입 되고, 여러개 출력 됨.
return 0;
}
이렇게 입출력이 너무 간단한게 cpp의 매력 중 하나라고 생각한다.
저렇게 불러올 라이브러리? 적어서 쓸 수 있다.
main 함수 안에 코드 적어야 실행시킬때 돌아간다.
아래는 백준 30024번 문제를 cpp로 다시 풀어보았다. 정답인지는 모르겠으나 로직은 원래 짰던 코드랑 같아서 뭐 맞을 것이다.
#include <iostream>
#include <algorithm>
#include <vector>
#include <utility>
#include <queue>
#define FASTIO ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
struct Corn {
int y, x, value;
Corn (int _y, int _x, int _value) {
y = _y;
x = _x;
value = _value;
}
bool operator< (const Corn& other) const {
return value < other.value;
}
};
using namespace std;
int main () {
FASTIO;
int N, M;
cin >> N >> M;
vector<vector<int>> farm(N+1, vector<int>(M+1));
priority_queue<Corn> pq;
for (int y = 1; y <= N; y++) {
for (int x = 1; x <= M; x++) {
cin >> farm[y][x];
if (y == 1 || y == N || x == 1 || x == M) {
pq.push(Corn(y, x, farm[y][x]));
}
}
}
int K;
cin >> K;
int dy[4] = { -1, 1, 0, 0 }, dx[4] = { 0, 0, -1, 1 };
vector<vector<bool>> visit(N+1, vector<bool>(M+1, false));
for (int k = 0; k < K; k++) {
Corn corn = pq.top(); pq.pop();
if (visit[corn.y][corn.x]) {
k -= 1;
continue;
}
visit[corn.y][corn.x] = true;
cout << corn.y << ' ' << corn.x << '\n';
for (int d = 0; d < 4; d++) {
int ny = corn.y + dy[d], nx = corn.x + dx[d];
if (ny < 1 || N < ny || nx < 1 || M < nx) {
continue;
}
if (visit[ny][nx]) {
continue;
}
pq.push(Corn(ny, nx, farm[ny][nx]));
}
}
return 0;
}
중요한거 몇개만 보겠다.
struct 얘는 java class? 라고 보면 된다. cpp안에 class가 따로 있긴 한데, 뭐 다를건 없다. bool operator< 함수를 오버라이딩해서, 객체의 우선순위를 직접 다룰 수도 있다. 위에 Corn 구조체 만들어서 operator 오버라이딩 한 후 우선순위큐에서 쓰는걸 볼 수 있는데, 이러면 value가 높은 corn 객체가 우선순위큐에서 먼저 나온다. vector 얘는 java의 arraylist처럼 동적배열 라이브러리이다. push_back으로 배열 맨 뒤에 요소를 넣을 수도 있으며, 처음 객체를 만들 때 두번째 인자로 값을 넣으면 그 값으로 채워주기도 한다.여기까지만 봐도 웬만한 문제는 다 풀 수 있다. queue나 map 같은 라이브러리 쓰는 법은 매번 필요할때마다 인터넷에 검색해서 쓰다보면 정말 쉽게 익힐 수 있으니 걱정 말고 씩씩하게 도전해보길 바란다.