n개의 프로세스가 있다고 가정합니다. 여기서 각 프로세스에는 PID 또는 프로세스 ID라는 고유한 ID가 있고 해당 PPID(상위 프로세스 ID)도 있습니다.
각 프로세스에는 하나의 상위 프로세스만 있지만 하나 이상의 하위 프로세스가 있을 수 있습니다.
이것은 트리 구조와 같습니다. 하나의 프로세스만 PPID =0을 가지며 이는 이 프로세스에 상위 프로세스가 없음을 의미합니다. 모든 PID는 고유한 양의 정수입니다.
두 개의 정수 목록을 사용하여 프로세스 목록을 나타냅니다. 첫 번째 목록에는 각 프로세스에 대한 PID가 포함되고 두 번째 목록에는 해당 PPID가 포함됩니다. 따라서 두 개의 목록과 우리가 죽이고자 하는 프로세스를 나타내는 PID가 있는 경우, 결국 죽게 될 프로세스의 PID 목록을 찾아야 합니다. 그리고 프로세스가 종료되면 모든 자식 프로세스가 종료된다고 가정해야 합니다.
따라서 입력이 pid =[1, 3, 10, 5] ppid =[3, 0, 5, 3] kill =5와 같으면 출력은 [5,10],
5명을 죽이면 10명도 죽입니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
하나의 지도 자식 정의
-
n :=pid의 크기
-
ret 배열 정의
-
initialize i :=0의 경우, i
-
유 :=ppid[i]
-
v :=pid[i]
-
자식[u]
끝에 v 삽입
-
-
하나의 대기열 정의 q
-
q에 kill 삽입
-
동안(q가 비어 있지 않음) -
를 수행합니다.-
curr :=q의 첫 번째 요소
-
q에서 요소 삭제
-
ret 끝에 curr 삽입
-
for initialize i :=0, i
-
q
에 자식[curr, i] 삽입
-
-
-
리턴 렛
예시
더 나은 이해를 위해 다음 구현을 살펴보겠습니다. −
#include <bits/stdc++.h> using namespace std; void print_vector(vector<auto> v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << v[i] << ", "; } cout << "]"<<endl; } class Solution { public: vector<int> killProcess(vector<int>& pid, vector<int>& ppid, int kill) { map<int, vector<int> > child; int n = pid.size(); vector<int> ret; for (int i = 0; i < n; i++) { int u = ppid[i]; int v = pid[i]; child[u].push_back(v); } queue<int> q; q.push(kill); while (!q.empty()) { int curr = q.front(); q.pop(); ret.push_back(curr); for (int i = 0; i < child[curr].size(); i++) { q.push(child[curr][i]); } } return ret; } }; main(){ Solution ob; vector<int> v = {1,3,10,5}, v1 = {3,0,5,3}; print_vector(ob.killProcess(v, v1, 5)); }
입력
{1,3,10,5},{3,0,5,3},5
출력
[5, 10, ]