λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Algorithm/BOJ

[BOJ] μ–‘ ꡬ좜 μž‘μ „(16437)

[λ°±μ€€(BOJ)] μ–‘ ꡬ좜 μž‘μ „(16437) C++

문제 : BOJ_16437번 μ–‘ ꡬ좜 μž‘μ „

문제 μ„€λͺ…

μœ„μƒμ •λ ¬, bfs

제λͺ©λ§Œ κ·€μ—½κ³  λ¬Έμ œλŠ” μ§•κ·ΈλŸ¬μš΄ μ–‘ ꡬ좜 μž‘μ „μž…λ‹ˆλ‹€.

λ¬Έμ œμ— μ •ν™•νžˆ μ œμ‹œλ˜μ–΄ μžˆλŠ” '1번 μ„¬μœΌλ‘œ κ°€λŠ” κ²½λ‘œλŠ” 유일' 을 μ£Όμ˜ν•΄μ„œ 읽어야 ν•˜κ³ , 각 섬에 μ–‘ ν˜Ήμ€ λŠ‘λŒ€κ°€ μžˆλŠ” 데,

섬에 양이 μžˆλ‹€λ©΄ λ‹€μŒ μ„¬μœΌλ‘œ λ„˜μ–΄κ°€λŠ” μ–‘μ˜ μˆ˜κ°€ λˆ„μ λ˜κ³ , λŠ‘λŒ€κ°€ μžˆλ‹€λ©΄ λŠ‘λŒ€μ˜ 수만큼 μ–‘μ˜ μˆ˜κ°€ 쀄어듀고, 양을 ν•œ 마리 μž‘μ•„λ¨Ήμ€ λŠ‘λŒ€λŠ” 더 이상 양을 μž‘μ•„λ¨Ήμ§€ μ•ŠκΈ° λ•Œλ¬Έμ— λŠ‘λŒ€μ˜ μˆ˜λ„ 쀄은 것과 κ°™μŠ΅λ‹ˆλ‹€.

λ¬Έμ œμ—μ„œ μΉœμ ˆν•˜κ²Œ 그림을 μ œμ‹œν•΄μ£Όμ—ˆλŠ”λ°,

(두 번째 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— λŒ€ν•œ κ·Έλ¦Ό)

n 번 μ§Έ 섬과 μ—°κ²°λœ μ„¬λ“€μ˜ λͺ¨λ“  양이 λˆ„μ λ˜μ–΄ n 번 μ§Έ 섬에 λ„μ°©ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. 즉, μ–‘μ˜ λˆ„μ μˆ˜λ₯Ό νŒŒμ•…ν•˜κΈ° μœ„ν•΄μ„œλŠ” μƒˆλΌ λ…Έλ“œμ˜ λˆ„μ λœ 양을 λͺ¨λ‘ λ”ν•œ λ’€ μ–΄λ―Έ λ…Έλ“œμ— λˆ„μ ν•΄μ•Ό λ˜λŠ”λ°, μ΄λŸ¬ν•œ κ³Όμ •μ—μ„œ μœ„μƒμ •λ ¬μ„ 써야 함을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.


Solution

μœ„μƒμ •λ ¬μ„ μ΄μš©ν•¨μ— μžˆμ–΄μ„œ dfs와 bfsλ₯Ό μ‚¬μš©ν•  수 μžˆλŠ”λ°, μ €λŠ” bfsλ₯Ό μ‚¬μš©ν–ˆκ³  λˆ„μ λœ μ–‘μ˜ 수λ₯Ό νŒλ‹¨ν•  λ•ŒλŠ” λ‹€μŒ 두 가지가 μ€‘μš”ν•©λ‹ˆλ‹€.

(1) λŠ‘λŒ€λ§Œ 남은 μƒˆλΌ λ…Έλ“œμ˜ μ„¬μ—μ„œλŠ” μ–΄λ―Έ λ…Έλ“œμ—κ²Œ 0의 μ–‘μ˜ 수λ₯Ό λˆ„μ ν•΄μ€€λ‹€.

(2) λ‹€μŒ 섬에 λ„μ°©ν•œ μ–‘μ˜ μˆ˜κ°€ λŠ‘λŒ€μ˜ 수 보닀 적을 μ‹œμ—”, κ·Έ μ„¬μ˜ λŠ‘λŒ€ 수λ₯Ό λŠ‘λŒ€ 수 - λ„μ°©ν•œ μ–‘μ˜ 수둜 λ°”κΏ”μ€€λ‹€.

μ΄λŸ¬ν•œ κ·œμΉ™μœΌλ‘œ i 번 μ§Έ μ„¬μ˜ indegree[i]κ°€ 0이 되면 ν‘Έμ‹œ ν•΄μ£ΌλŠ” λ°©μ‹μœΌλ‘œ μœ„μƒμ •λ ¬μ„ μ§„ν–‰ν•©λ‹ˆλ‹€.

μ΅œμ’…μ μœΌλ‘œ 1번 섬에선 1번 섬과 μ—°κ΄€λœ μƒˆλΌ λ…Έλ“œλ₯Ό λͺ¨λ‘ νƒμƒ‰ν–ˆκΈ° λ•Œλ¬Έμ— λ§ˆμ§€λ§‰μœΌλ‘œ λ„μ°©ν•œ μ–‘μ˜ 수λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.


Description

  1. *ν•œ 섬에 λ¨Έλ¬Ό 수 μžˆλŠ” μ–‘κ³Ό λŠ‘λŒ€ μˆ˜κ°€ μ΅œλŒ€ 10^9, μ–‘κ³Ό λŠ‘λŒ€κ°€ μžˆμ„ 수 μžˆλŠ” μ„¬μ˜ κ°œμˆ˜λŠ” μ΅œλŒ€ 123,456-1 => 10^9 * (123,456-1)은 intν˜•μ˜ λ²”μœ„λ₯Ό μ΄ˆκ³Όν•¨μœΌλ‘œ long longν˜•μ„ μ΄μš©ν•΄ %lld둜 좜λ ₯ν•΄μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€.
  2. μž…λ ₯ μ‹œ, μ„¬μ˜ 개수λ₯Ό μž…λ ₯λ°›κ³  λ°”λ‘œ char ν˜•μΈ ti을 μž…λ ₯λ°›κΈ° λ•Œλ¬Έμ— 엔터에 μ˜ν•œ 버퍼λ₯Ό 생각해주지 μ•ŠλŠ”λ‹€λ©΄ μž…λ ₯ μ‹œ 였λ₯˜κ°€ μƒκΉλ‹ˆλ‹€.
  3. 버퍼λ₯Ό κ³ λ €ν•˜μ—¬ μž…λ ₯을 λ°›λŠ” κ²½μš°λŠ” 두 가지가 μžˆμŠ΅λ‹ˆλ‹€.
(1) cinκ³Ό getchar()λ₯Ό μ΄μš©ν•˜λŠ” 경우, (2) scanf()λ₯Ό μ΄μš©ν•˜λŠ” 경우  

ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 수λ₯Ό roof, μ–‘, λŠ‘λŒ€ μ—¬λΆ€λ₯Ό t, 섬에 μžˆλŠ” 동물 수λ₯Ό a, λ‹€μŒ μ„¬μ˜ 번호λ₯Ό p라고 ν•˜κ³  (1),(2) 번 λͺ¨λ‘ μž…λ ₯λ°›λŠ” 경우λ₯Ό μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

버퍼λ₯Ό κ³ λ €ν•˜μ—¬ μž…λ ₯λ°›κΈ°

//(1)
#include <iostream>
using namespace std;
int roof, p;
char t;
long long a;
int main() {
    cin >> roof;
    getchar(); // getchar()둜 버퍼λ₯Ό λ°›μ•„μ€Œ**
    for (int i = 0; i < roof; i++) {
        cin>>t>>a>>p;
    }
}
//(2)
#include <iostream>
using namespace std;
int roof, p;
char t;
long long a;
int main() {
    scanf("%d", &roof);
    for (int i = 0; i < roof; i++) {
        scanf(" %c%lld%d", t, a, p); // λ„μ–΄μ“°κΈ°λ‘œ 버퍼λ₯Ό μž‘μ•„μ€Œ **
    }
}

μœ„μ™€ 같이 버퍼λ₯Ό λ°›μ•„ 쀄 수 μžˆμŠ΅λ‹ˆλ‹€.


Solution Code

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int roof, line[123457], vis[123457];
long long pm[123457], res;
vector<int> adj[123457];
queue<int> q;
int main(void) {
    scanf("%d", &roof);
    for (int i = 2; i <= roof; i++) {
        char t;
        long long a; // long long ν˜•!! ***
        int p;
        scanf(" %c%lld%d", &t, &a, &p); // λ„μ–΄μ“°κΈ°λ‘œ 버퍼 λ°›κΈ°
        if (t == 'S') pm[i] = a;
        else if (t == 'W') pm[i] = -a;
        adj[i].push_back(p);
        line[p]++; // line == indegree
    }
    for (int i = 1; i <= roof; i++) {
        if (line[i] == 0) q.push(i);
    }
    while (!q.empty()) {
        int now = q.front();
        q.pop();
        for (int i = 0; i < adj[now].size(); i++) {
            int next = adj[now][i];
            if (pm[now] >= 0) pm[next] += pm[now]; /* 0 이상이라면 λ‹€μŒ 섬에 λˆ„μ ,
                                                   μ–‘μ˜ μˆ˜κ°€ +, λŠ‘λŒ€μ˜ μˆ˜κ°€ - μž„μœΌλ‘œ λ“€μ–΄μ˜¨ μ–‘μ˜ 수 만큼 λŠ‘λŒ€κ°€ ν•œ 마리만 λ¨Ήκ²Œλœλ‹€.*/
            line[next]--;
            if (line[next] == 0) q.push(next);
        }
    }
    printf("%lld\n", pm[1]); // %lld둜 좜λ ₯!! ***
    return 0;
}

'Algorithm > BOJ' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[BOJ] ACM Craft(1005)  (0) 2022.03.05
[BOJ] 이λͺ¨ν‹°μ½˜(14226)  (0) 2022.03.05
[BOJ] μƒˆλΌμΉ˜κΈ°(17291)  (0) 2022.03.05
[BOJ] λ¬Έμ œμ§‘(1776)  (0) 2022.03.05
[BOJ] ν–‰λ³΅ν•œ μ†Œμˆ˜(10434)  (0) 2022.03.05