pair

pair는 C++에서 다른 라이브러리 없이도 만들 수 있는 자료구조다. pair를 통해 두 가지의 데이터를 묶어서 그룹화 할 수 있다. 만약 객체를 만들어야 할 경우 make_pair() 함수를 이용하면 된다.

//선언
pair<int, int> a;
pair<int, double> a(1, 10.0);

//vector와 pair를 같이 이용
vector<pair<int, int> > v;

//객체 생성
v.push_back(make_pair(1, 1));

map

map(또는 unordered_map)은 key와 value로 이루어져 있으며 key값을 통해 value값을 좀 더 빠르게 찾을 수 있다.(데이터의 양이 많아지면 unordered_map의 속도가 더 빠르다)

#include <map>
#include <string>

//map 생성
map<string, int> m;

//객체 입력
string s = "hello";
m.insert(make_pair(s, 1));

//객체 출력
cout << m[s] << endl;  //1 출력

문제 설명

Untitled

Code Review

  1. 이름을 통해 현재 위치와 다음 이름을 빠르게 확인할 수 있는 unordered_map을 만든다.
  2. 탐색할 데이터를 저장한다.
  3. 모든 판매에 대하여 다음을 수행한다.
    1. 판매자 이름과 남은 돈을 초기화한다.
    2. 판매자 이름이 “-”가 되거나 돈이 0일 때까지 반복하면서 해당 인원의 이름과 금액을 업데이트한다.
#include <string>
#include <vector>
#include <algorithm>
#include <unordered_map>

using namespace std;

vector<int> solution(vector<string> enroll, vector<string> referral, vector<string> seller, vector<int> amount) {
    vector<int> answer(enroll.size(), 0);
    unordered_map<string, pair<int, string> > search;  //이름을 통해 현재 위치(int)와 다음 이름을 찾을 수 있음
    string temp;
    int money, left;
    
		//탐색할 데이터 저장
    for(int i = 0; i < enroll.size(); i++)  search.insert(make_pair(enroll[i], make_pair(i, referral[i])));

		//모든 판매에 대하여 반복 수행
    for(int i = 0; i < seller.size(); i++){
				//판매자와 남은 돈 초기화
        temp = seller[i];
        money = amount[i] * 100;
				//최종 단계의 사람일 때가 아니고 돈도 있어야 반복 수행
        while(temp.compare(string("-")) != 0 && money != 0){
            auto &iter = search[temp];  //현재 이름에 해당하는 데이터 참조
            left = money / 10;  //잔돈 계산
            answer[iter.first] += money - left;  //해당 인원 금액 업데이트
            money = left;
            temp = iter.second;
        }
    }
    
    return answer;
}