알고리즘 문제풀이/프로그래머스

[프로그래머스/Level 1] 신고 결과 받기

노력의천재 2022. 10. 3. 18:54

https://school.programmers.co.kr/learn/courses/30/lessons/92334

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

카카오 기출 (다시 풀기, 작년 공채 때 풀었는데 왜 못풀지? ㅋ)

 

신고 내역을 담을 map과 신고 결과를 기록할 map을 각각 선언하여 문제를 해결할 수 있다.

다음과 같이 입력 값이 주어졌다고 가정해보자.

["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"], k = 2

 

신고 내역(key=신고자, value=피신고자 집합)

muzi : {"frodo", "neo"}

frodo : {"neo"} 

apeach : {"frodo", "muzi"}

neo : {}

 

신고 결과(key=피신고자, value=신고자 집합)

muzi : {"apeach"}

frodo : {"muzi", "apeach"}

apeach : {}

neo : {"muzi", "frodo"}

 

2(k)번 이상 신고를 받은 frodo와 neo가 정지되며, 해당 유저들을 신고한 muzi에게 2번, apeach 1번, frodo 1번 메일이 전송된다.

 

※ 이중 for문이 나오는 곳에서 TLE이 발생할 수 있지 않나 의심할 수 있지만, set의 최대 크기가 id_list의 크기 이므로, O(n^2) 라도 1,000 * 1,000 = 1,000,000 라서 문제없다.

#include <string>
#include <vector>
#include <map>
#include <set>
#include <sstream>
#include <algorithm>
#include <iostream>
using namespace std;

map<string, set<string>> reportHash, resultHash;

vector<int> solution(vector<string> id_list, vector<string> report, int k) {
    vector<int> answer(id_list.size());
    for(auto r : report) {
        stringstream ss(r);
        string from, to;
        getline(ss, from, ' ');
        getline(ss, to, ' ');
        reportHash[from].insert(to);
        resultHash[to].insert(from);
    }
    
    for(int i = 0; i < id_list.size(); i++) {
        string id = id_list[i];
        for(auto report : reportHash[id]) {
            if(resultHash[report].size() >= k) answer[i]++;
        }
    }
    
    return answer;
}