[백준 BOJ] 26069번 붙임성 좋은 총총이 (C++/cpp)

2024. 4. 15. 23:44PS (Program Solving)/BOJ (백준)

문제 설명

https://www.acmicpc.net/problem/26069

 

26069번: 붙임성 좋은 총총이

첫번째 줄에는 사람들이 만난 기록의 수 $N\ (1 \le N \le 1\ 000)$이 주어진다. 두번째 줄부터 $N$개의 줄에 걸쳐 사람들이 만난 기록이 주어진다. $i + 1$번째 줄에는 $i$번째로 만난 사람들의 이름 $A_i$

www.acmicpc.net

백준 BOJ 26069번 붙임성 좋은 총총이 문제 사진1
백준 BOJ 26069번 붙임성 좋은 총총이 문제 사진2

 

접근 방법 - 맵과 벡터를 활용한 문자열 연산 문제

백준의 26069번 문제는 맵과 벡터 자료구조를 활용하여 문자열에 대한 연산을 처리해야 하는 문제이다.

해당 문제는, "ChongChong"의 무지개 댄스가 만난 사람마다 전염(?)된다고 할 때 무지개 댄스를 추는 총인원을 구하여 출력해야 하는 문제이다.

필자는 맵과 벡터 자료구조를 아래와 같이 활용하였다.

  • 맵 :: <string, bool> 타입으로 사용하였으며, 특정 사람이 무지개 댄스를 추고 있는지의 여부를 저장하게끔 하였다.
  • 벡터 :: <string> 타입으로 사용하였으며, 무지개 댄스를 추는 사람의 명단을 저장하게끔 하였다.

이때 연산이 모두 끝난 뒤에는, 벡터에 중복되는 이름이 없도록 중복 요소 제거 연산도 별도로 수행하였다.

자세한 내용은 아래에 기재해 놓으니, 혹여나 해당 문제를 해결하는 데에 어려움을 겪고 있다면 아래의 설명과 코드를 참고해 보길 바란다.

필자는 아래의 순서대로 코드를 작성하여 문제를 해결하였다.

 

코드의 실행 순서

1) 파티에서 각 사람들이 만난 횟수(t)를 입력받는다.

 

2) 위 용도로 사용할 맵(rainbow)과 벡터(n)를 선언해 둔다.

그리고 "ChongChong"은 이미 무지개 댄스를 추고 있기 때문에, rainbow와 n에 대해 요소를 미리 적절히 추가해 둔다.

 

3) t의 크기만큼, 반복문을 수행하여 아래의 연산을 취한다.

- 서로 만난 사람 2명의 이름(name1, name2)을 입력받는다.

- 만일 rainbow 상에서 name1을 인덱스로 갖는 값이 true라면, 이는 name1이 이미 무지개 댄스를 추고 있음을 의미한다. 따라서 이 때는, 무지개 댄스가 전염되게끔(...) name2 값을 rainbow와 n에 대해 요소를 적절히 추가한다.

(rainbow[name2]의 값이 true인 경우에도, name1 값을 맵과 벡터에 요소 추가를 수행하도록 한다.)

 

4) 위 연산을 완료하였다면, 무지개 댄스를 추고 있는 명단인 n에 대하여 중복 제거 연산을 수행한다.

(서로 만난 두 사람이 모두 무지개 댄스를 추고 있었을 가능성도 있기 때문에, 반드시 중복 제거를 수행해야 한다.)

 

5) 현재 벡터 n의 크기를 정답으로 출력한 뒤, 실행 종료한다.

반응형

 

성공한 코드

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
#define endl '\n'
using namespace std;

//백준 26069번 코드
int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);   cout.tie(NULL);

    int t;
    cin >> t;
    cin.ignore();

    map<string, bool> rainbow;
    vector<string> n;
    rainbow.insert({ "ChongChong", true });
    n.push_back("ChongChong");
    for (int i = 0; i < t; i++) {
        string name1, name2;
        cin >> name1 >> name2;

        if (rainbow[name1] == true) { 
            n.push_back(name2);
            rainbow[name2] = true; 
        }
        if (rainbow[name2] == true) { 
            n.push_back(name1);
            rainbow[name1] = true; 
        }
    }
    sort(n.begin(), n.end());
    n.erase(unique(n.begin(), n.end()), n.end());

    cout << n.size() << endl;
}

 

제출 결과

백준 BOJ 26069번 붙임성 좋은 총총이 문제 C++ 제출 결과

(2024.02.03 백준 26069번 문제 제출 결과)

반응형