BOJ 9085번 더하기 문제

그냥 n개를 덧셈을 해서 출력하면 된다.

9085.cpp

#include <bits/stdc++.h>
using namespace std;

void solve() {
    int n;
    int result = 0;
    cin >> n;
    while (n--) {
        int plus;
        cin >> plus;
        result += plus;
    }
    cout << result << '\n';
}

int main() {
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
}

BOJ 1547번 공 문제

1을 true로 해놓고 바뀔때마다 바뀌는 것끼리 swap해주면 풀 수 있다.

1547.cpp

#include <bits/stdc++.h>
using namespace std;

bool ball[4];

int main() {
    int n;
    cin >> n;
    ball[1] = true;
    while (n--) {
        int one, two;
        cin >> one >> two;
        swap(ball[one], ball[two]);
    }
    for (int i = 1; i <= 3; i++) {
        if (ball[i]) {
            cout << i;
            return 0;
        }
    }
    cout << "-1";
    return 0;
}

BOJ 1197번 최소 스패닝 트리 문제

문제 이름 그대로 최소 스패닝 트리 문제였다.

1197.cpp

#include <bits/stdc++.h>
using namespace std;
#define MAXX 10001
typedef long long ll;

struct Edge {
    int v1;
    int v2;
    int weight;
    bool operator<(Edge &e) {
        // 가중치 순으로 정렬하기 위해 정의해줘야한다.
        return weight < e.weight;
    }
};

int v, e;
int parent[MAXX];
int setSize[MAXX];
ll weights = 0;

void init();                // parent, setSize 배열 초기화
int find_(int n);           // 부모를 찾는 함수
void union_(int a, int b);  // 집합을 합치는 함수

int main() {
    cin >> v >> e;
    vector<Edge> edgeV;
    for (int i = 0; i < e; i++) {
        int a, b, c;
        // 정점과 가중치 입력 받기.
        cin >> a >> b >> c;
        edgeV.push_back({a, b, c});
    }
    // 가중치 순으로 정렬한다.
    sort(edgeV.begin(), edgeV.end());
    init();
    for (int i = 0; i < e; i++) {
        // 같은 집합이 아니면
        if (find_(edgeV[i].v1) != find_(edgeV[i].v2)) {
            union_(edgeV[i].v1, edgeV[i].v2);
            weights += edgeV[i].weight;
        }
    }
    cout << weights << '\n';
}

void init() {
    for (int i = 0; i < v; i++) {
        parent[i] = i;
        setSize[i] = 0;
    }
}

int find_(int n) {
    if (n == parent[n]) {
        return n;
    }
    return parent[n] = find_(parent[n]);
}

void union_(int a, int b) {
    a = find_(a);
    b = find_(b);
    if (a != b) {
        // 크기가 작은 쪽이 큰 쪽으로 합치게끔 구현한다.
        if (setSize[a] < setSize[b]) {
            swap(a, b);
        }
        parent[b] = a;
        setSize[a] += setSize[b];
        setSize[b] = 0;
    }
}

'알고리즘 & SQL > 백준(BOJ)' 카테고리의 다른 글

백준 9085번 : 더하기 C++  (0) 2018.12.01
백준 1547번 : 공 C++  (0) 2018.12.01
백준 1753번 : 최단경로 C++  (0) 2018.11.28
백준 1922번 : 네트워크 연결 C++  (0) 2018.11.28
백준 16398번 : 행성 연결 C++  (0) 2018.11.28

BOJ 1753번 최단경로 문제

다익스트라로 풀 수 있는 문제다. 구현이 생각보다 잘 안돼서 다른 코드를 참조했다.

1753.cpp

#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define MAXX 20001

int v, e, k;
int from, to, cost;
vector<pair<int, int>> graph[MAXX];

vector<int> dijkstra(int start, int vertex) {
    vector<int> distance(vertex, INF);  // start ~ 각 vertex 까지의 거리 저장, 초기값 INF
    distance[start] = 0;                // start ~ start = 0

    // 최소 힙 생성 pair<cost, vertex>
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
    pq.push({0, start});

    while (!pq.empty()) {
        int cost = pq.top().first;
        int currentVertex = pq.top().second;
        pq.pop();

        // 이미 더 작을 경우 넘어가자.
        if (distance[currentVertex] < cost) {
            continue;
        }

        int neighborNum = graph[currentVertex].size();
        for (int i = 0; i < neighborNum; i++) {
            int neighbor = graph[currentVertex][i].first;             // to
            int distanceToN = cost + graph[currentVertex][i].second;  // cost

            if (distance[neighbor] > distanceToN) {
                distance[neighbor] = distanceToN;
                pq.push({distanceToN, neighbor});
            }
        }
    }
    return distance;
}

int main() {
    cin >> v >> e >> k;
    for (int i = 0; i < e; i++) {
        cin >> from >> to >> cost;
        // from에서 to로 가는 cost를 저장한다.
        graph[from].push_back({to, cost});
    }
    // 0부터 시작해서 v에 1을 더해줘야 한다.
    vector<int> result = dijkstra(k, v + 1);
    for (int i = 1; i < v + 1; i++) {
        if (result[i] == INF) {
            cout << "INF" << '\n';
        } else {
            cout << result[i] << '\n';
        }
    }
}

BOJ 1922번 네트워크 연결 문제

MST로 풀면 된다.

1922.cpp

#include <bits/stdc++.h>
using namespace std;
#define MAXX 1001
typedef long long ll;
struct Edge {
    int v1;
    int v2;
    int c;
    bool operator<(Edge &e) {
        return c < e.c;
    }
};

int n, m;
int parent[MAXX];
int setSize[MAXX];
vector<Edge> ev;

void init();                // parent, setSize 배열 초기화
int find_(int n);           // 부모를 찾는 함수
void union_(int a, int b);  // 집합을 합치는 함수

int main() {
    cin >> n >> m;
    for (int i = 0; i < m; i++) {
        int v1, v2, c;
        cin >> v1 >> v2 >> c;
        ev.push_back({v1, v2, c});
    }
    sort(ev.begin(), ev.end());
    init();
    ll result = 0;
    for (int i = 0; i < m; i++) {
        // 같은 집합이 아니면
        if (find_(ev[i].v1) != find_(ev[i].v2)) {
            union_(ev[i].v1, ev[i].v2);
            result += ev[i].c;
        }
    }
    cout << result;
}

void init() {
    for (int i = 0; i < n; i++) {
        parent[i] = i;
        setSize[i] = 0;
    }
}

int find_(int n) {
    if (n == parent[n]) {
        return n;
    }
    return parent[n] = find_(parent[n]);
}

void union_(int a, int b) {
    a = find_(a);
    b = find_(b);
    if (a != b) {
        // 크기가 작은 쪽이 큰 쪽으로 합치게끔 구현한다.
        if (setSize[a] < setSize[b]) {
            swap(a, b);
        }
        parent[b] = a;
        setSize[a] += setSize[b];
        setSize[b] = 0;
    }
}

BOJ 16398번 행성 연결 문제

2018 홍익대학교 E번 문제였다. MST로 어렵지 않게 풀 수 있다.

16398.cpp

#include <bits/stdc++.h>
using namespace std;
#define MAXX 1001
typedef long long ll;
struct Edge {
    int v1;
    int v2;
    int c;
    bool operator<(Edge &e) {
        return c < e.c;
    }
};

int n;
int parent[MAXX];
int setSize[MAXX];
vector<Edge> ev;

void init();                // parent, setSize 배열 초기화
int find_(int n);           // 부모를 찾는 함수
void union_(int a, int b);  // 집합을 합치는 함수

int main() {
    cin >> n;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            int cost;
            cin >> cost;
            if (i < j) {
                ev.push_back({i, j, cost});
            }
        }
    }
    sort(ev.begin(), ev.end());
    init();
    ll result = 0;
    for (int i = 0; i < ev.size(); i++) {
        // 같은 집합이 아니면
        if (find_(ev[i].v1) != find_(ev[i].v2)) {
            union_(ev[i].v1, ev[i].v2);
            result += ev[i].c;
        }
    }
    cout << result;
}

void init() {
    for (int i = 0; i < n; i++) {
        parent[i] = i;
        setSize[i] = 0;
    }
}

int find_(int n) {
    if (n == parent[n]) {
        return n;
    }
    return parent[n] = find_(parent[n]);
}

void union_(int a, int b) {
    a = find_(a);
    b = find_(b);
    if (a != b) {
        // 크기가 작은 쪽이 큰 쪽으로 합치게끔 구현한다.
        if (setSize[a] < setSize[b]) {
            swap(a, b);
        }
        parent[b] = a;
        setSize[a] += setSize[b];
        setSize[b] = 0;
    }
}

BOJ 1916번 최소비용 구하기 문제

다익스트라 알고리즘으로 풀면 된다. 전에 풀었던 코드를 가져와서 수정했다.

1916.cpp

#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define MAXX 20001

int n, m;
int from, to, cost;
vector<pair<int, int>> graph[MAXX];

vector<int> dijkstra(int start, int vertex) {
    vector<int> distance(vertex, INF);  // start ~ 각 vertex 까지의 거리 저장, 초기값 INF
    distance[start] = 0;                // start ~ start = 0

    // 최소 힙 생성 pair<cost, vertex>
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
    pq.push({0, start});

    while (!pq.empty()) {
        int cost = pq.top().first;
        int currentVertex = pq.top().second;
        pq.pop();

        // 이미 더 작을 경우 넘어가자.
        if (distance[currentVertex] < cost) {
            continue;
        }

        int neighborNum = graph[currentVertex].size();
        for (int i = 0; i < neighborNum; i++) {
            int neighbor = graph[currentVertex][i].first;             // to
            int distanceToN = cost + graph[currentVertex][i].second;  // cost

            if (distance[neighbor] > distanceToN) {
                distance[neighbor] = distanceToN;
                pq.push({distanceToN, neighbor});
            }
        }
    }
    return distance;
}

int main() {
    cin >> n >> m;
    for (int i = 0; i < m; i++) {
        cin >> from >> to >> cost;
        // from에서 to로 가는 cost를 저장한다.
        graph[from].push_back({to, cost});
    }
    // 0부터 시작해서 v에 1을 더해줘야 한다.
    int start, end;
    cin >> start >> end;
    vector<int> result = dijkstra(start, n+1);
    cout << result[end];
}

+ Recent posts