λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ‘©‍πŸ’» μ•Œκ³ λ¦¬μ¦˜/문제

[BOJ/C++/2002] μΆ”μ›”

by kekeyo 2025. 7. 3.
728x90

πŸ‘€ 문제

 

[문제 μš”μ•½]

- λŒ€κ·Ό: μ°¨κ°€ 터널에 λ“€μ–΄κ°€λŠ” μˆœμ„œλŒ€λ‘œ

- μ˜μ‹: μ°¨κ°€ ν„°λ„μ—μ„œ λ‚˜μ˜€λŠ” μˆœμ„œλŒ€λ‘œ

=> 터널 λ‚΄λΆ€μ—μ„œ λ°˜λ“œμ‹œ μΆ”μ›Œν–ˆμ„ μ°¨κ°€ λͺ‡ λŒ€μΈμ§€ 좜λ ₯


πŸ“ μ ‘κ·Ό 방법

μ°¨λŸ‰ 번호(string)와 λ“€μ–΄κ°„ μˆœμ„œ(int)λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•΄ μ²˜μŒμ—λŠ” vector<make_pair<string, int> > λ₯Ό μ‚¬μš©ν• κΉŒ μƒκ°ν–ˆμ§€λ§Œ

μ°¨λŸ‰ 번호λ₯Ό 빨리 νƒμƒ‰ν•΄μ„œ μˆœμ„œλ₯Ό ν™•μΈν•˜λŠ” 게 쒋을 κ±° κ°™μ•„ map<string, int>λ₯Ό μ‚¬μš©ν•˜μ˜€λ‹€. 

 

일단 n개의 μ€„λ§ŒνΌ μž…κ΅¬μ—μ„œ λ“€μ–΄κ°„ μ°¨λŸ‰μ˜ μˆœμ„œλ₯Ό μ €μž₯ν•œλ‹€.

ZG431SN -> 0
ZG5080K -> 1
ST123D    -> 2
ZG206A   -> 3

이런 μ‹μœΌλ‘œ μ°¨λŸ‰ 번호λ₯Ό key둜 ν•΄μ„œ μ €μž₯ν•˜λŠ” map을 μ‚¬μš©ν•˜μ˜€λ‹€.

 

그리고 κ·Έ λ‹€μŒ n개의 μ€„λ§ŒνΌμ€ μΆœκ΅¬μ—μ„œ λ‚˜μ˜€λŠ” μ°¨λŸ‰μ΄ μž…μž₯ν•  λ•ŒλŠ” λͺ‡ λ²ˆμ§Έμ˜€λŠ”μ§€ κ³„μ‚°ν•˜κ³  κ·Έ 값을 백터에 μ €μž₯ν•œλ‹€.

μ°¨λŸ‰λ²ˆν˜Έ 퇴μž₯ μˆœμ„œ μž…μž₯ μˆœμ„œ  
ZG206A 0 3 v[0]
ZG431SN 1 0 v[1]
ZG5080K 2 1 v[2]
ST123D 3 2 v[3]

 

그리고 이제 μΆ”μ›”ν•œ μ°¨λŸ‰μ˜ 개수λ₯Ό 확인해야 ν•œλ‹€.

"좔월을 ν•œλ‹€" -> λ¨Όμ € λ“€μ–΄κ°„ 차보닀 λ‚΄κ°€ λ¨Όμ € λ‚˜μ˜€λ©΄ μΆ”μ›”ν•œ κ±°

 

v[0] = 3 (ZG206A) -> 제일 λ§ˆμ§€λ§‰μ— λ“€μ–΄κ°”λ‹€.

- v[1] = 0 

- ZG206AλŠ” 제일 λ§ˆμ§€λ§‰μ— λ“€μ–΄κ°”λŠ”λ° 퇴μž₯ μˆœμ„œκ°€ 제일 λΉ¨λžμœΌλ―€λ‘œ λ°˜λ“œμ‹œ μΆ”μ›”

 

v[1] = 0 (ZG431SN)

- v[2] = 1 | μΆ”μ›” X

- v[3] = 2 | μΆ”μ›” X

 

v[2] = 1 (ZG5080K)

- v[3] = 2 | μΆ”μ›” X

 

이거λ₯Ό μ •λ¦¬ν•˜λ©΄ 

for (int i = 0; i < n; i++) {
    for (int j = i + 1; j < n; j++) {
        if (v[i] > v[j]) {
            cnt++;
            break;
        }
    }
}

이런 μ‹μœΌλ‘œ μΆ”μ›”ν•œ μ°¨λŸ‰μ˜ 개수λ₯Ό 계산할 수 μžˆλ‹€.

 

 


😎 ν•΄κ²° μ½”λ“œ

#include <iostream>
#include <map>
#include <vector>
using namespace std;

int main() {
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);

    int n; cin >> n;        // μ°¨λŸ‰μ˜ 수
    string s;

    map<string, int> m;
    vector<int> v(n);

    for (int i = 0; i < n; i++) {
        cin >> s;
        m[s] = i;       // λ“€μ–΄μ˜¨ μˆœμ„œλŒ€λ‘œ 기둝
    }

    for (int i = 0; i < n; i++) {
        cin >> s;
        v[i] = m[s];    // λ‚˜μ˜€λŠ” μ°¨λŸ‰μ„ λ“€μ–΄μ˜¨ λ²ˆν˜ΈλŒ€λ‘œ 벑터에 μ €μž₯
    }

    int cnt = 0;    // μΆ”μ›”ν•œ μ°¨λŸ‰μ˜ 개수

    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            if (v[i] > v[j]) {
                cnt++;
                break;
            }
        }
    }

    cout << cnt;
}

⚠️ ν‹€λ¦¬κ±°λ‚˜ μ‹œκ°„μ΄ 였래 κ±Έλ¦° 이유


πŸ“š 배운 점

map: key와 value ν•œ 쌍으둜 이루어진 μžλ£Œν˜•

- 각 λ…Έλ“œκ°€ key, value 쌍으둜 이루어진 Tree ꡬ쑰λ₯Ό 띄고 있음

- 일반 map은 key 값을 μ˜€λ¦„μ°¨ 순으둜 μ •λ ¬ν•˜μ—¬ μ €μž₯함. (속도가 μ€‘μš”ν•˜λ©΄ unordered_map을 μ‚¬μš©ν•˜κΈ°λ„ 함)

 

728x90