티스토리 뷰
성공 코드(내 코드)
- 2차원 벡터 organize에 report의 내용을 정리한다.
- id_list의 사이즈만큼 n*n 2차원 배열 organize를 생성한다.
- 각각의 행과 열은 id_list의 인덱스 값에 해당되는 사람을 나타내고
- 행에 해당되는 사람이 누구를 신고했는지 해당 행의 원소들에 체크를 하게 된다.
- 0을 1로 바꿈으로써 체크가 이루어진다. 이렇게 함으로써 중복되는 신고는 한번으로 처리 가능하다.
- 행에 해당되는 사람이 누구를 신고했는지 해당 행의 원소들에 체크를 하게 된다.
- organize의 각각의 열을 탐색하며 k번 이상 신고된 자의 인덱스를 stopped 벡터에 추가한다.
- organize를 행마다 탐색하며 이때 cnt는 0이 된다.
- stopped가 체크되어 있으면 cnt를 증가시켜 메일을 받은 횟수를 증가시킨다.
- 그리고 해당 행의 탐색이 끝나면 answer 벡터에 cnt의 값을 넣는다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution(vector<string> id_list, vector<string> report, int k) {
vector<int> answer;
vector<vector <int>> organize(id_list.size(), vector<int>(id_list.size()));
vector<int> stopped;
for(int i=0; i<report.size(); i++){
int mid=report[i].find(" ");
int reporter = find(id_list.begin(), id_list.end(), report[i].substr(0, mid))-id_list.begin();
int reported = find(id_list.begin(), id_list.end(), report[i].substr(mid+1, report[i].size()-mid-1))-id_list.begin();
if(organize[reporter][reported]==0){
organize[reporter][reported]=1;
}
}
for(int i=0; i<id_list.size(); i++){
int cnt=0;
for(int j=0; j<id_list.size(); j++){
if(organize[j][i]==1){
cnt++;
}
if(cnt>=k){
stopped.push_back(i);
break;
}
}
}
for(int i=0; i<id_list.size(); i++){
int cnt=0;
for(int j=0; j<stopped.size(); j++){
if(organize[i][stopped[j]]==1){
cnt++;
}
}
answer.push_back(cnt);
}
return answer;
}
다른 사람 풀이
- id_list의 값들을 map을 이용해 Conv에 저장한다.
- Conv는 string과 int로 이루어져 있다.
- sort 후 중복 신고를 제거하기 위해 unique후 erase 한다.
- stringstream을 통해 report의 내용을 " "를 제외하고 두 string으로 빼낸다.
- 벡터 v에 뽑아낸 두 문자열에 맞게 pair를 Conv를 이용하여 만들어 넣는다.
- v를 탐색하며
- 벡터 cnt에 사람별로 신고당한 횟수를 저장하고
- v를 탐색하며
- 벡터 cnt 원소의 값이 k 이상인 원소에 대하여
- 메일을 받은 횟수를 나타내는 벡터 ret에서 신고한 사람의 인덱스에 해당되는 ret 원소의 값을 1 증가시킨다.
- 벡터 cnt 원소의 값이 k 이상인 원소에 대하여
문자열을 나누는 stringstream
- 주어진 문자열에서 필요한 자료형에 맞는 정보를 꺼낼 때 유용하게 사용된다.
- stringstream에서 공백과 '\n\을 제외하고 문자열에 맞는 자료형의 정보를 빼낸다.
- #include <<sstream> 전처리 헤더를 필수로 포함해야 한다.
- stream.str(string str)은 현재 stream의 값을 문자열 str로 바꾼다.
- stringstream 초기화
- stream.str(""); 구문을 통해 초기화한다.
#include <bits/stdc++.h>
#define fastio cin.tie(0)->sync_with_stdio(0)
using namespace std;
vector<int> solution(vector<string> id_list, vector<string> report, int k) {
// 1.
const int n = id_list.size();
map<string, int> Conv;
for (int i = 0; i < n; i++) Conv[id_list[i]] = i;
// 2.
vector<pair<int, int>> v;
sort(report.begin(), report.end());
report.erase(unique(report.begin(), report.end()), report.end());
for (const auto& s : report) {
stringstream in(s);
string a, b; in >> a >> b;
v.push_back({ Conv[a], Conv[b] });
}
// 3.
vector<int> cnt(n), ret(n);
for (const auto& [a, b] : v) cnt[b]++;
for (const auto& [a, b] : v) if (cnt[b] >= k) ret[a]++;
return ret;
}
'알고리즘' 카테고리의 다른 글
[프로그래머스/c++] 구명보트 (0) | 2022.09.29 |
---|---|
[프로그래머스/c++] 성격 유형 검사하기 (0) | 2022.08.26 |
[프로그래머스/c++] 신규 아이디 추천 (0) | 2022.08.24 |
[프로그래머스/c++] 숫자 문자열과 영단어 (0) | 2022.08.24 |
[프로그래머스/c++] 키패드 누르기 (0) | 2022.08.24 |