프로그래머스의 매칭점수(Lv3) 문제이다.

 

[ 문제풀이 ]

일단, 문제가 보면.... 조금 막막하다.. 문제의 설명을 읽으면서 무엇을 구해야 하는지만 봤을 때는 괜찮은 문제인 것 같은데.. 밑에 제한사항과 입출력 예시들을 보면... 굉장히 문제에 대한 거부감이 나도 모르게 올라오는 문제인 것 같다..

하지만 ! 거창한 입출력과는 달리, 생각보다 풀만한 문제이니까 차근차근 단계별로 풀어가보도록 하자.

 

#1. 구해야 하는 정보

문제가 거창한 만큼, 우리가 구해야 하는 정보들부터 깔끔하게 정리를 하고 이 정보들을 어떻게 구할 것인지 구체적인 방법에 대해서 이야기해보자.

먼저, 우리가 구해야 할 정보들에 대해서 부터 이야기해보자.

문제의 가장 초반부분에 설명으로 나와있는 것들이다. 우리는 이 문제에서 주어지는 "웹페이지"에서 다음과 같은 정보들을 구하면 된다.

1. 기본 점수

2. 외부 링크 수

3. 링크 점수

4. 매칭 점수

이렇게 딱 4개만 구하면 된다. 지금부터 이 정보들을 각각 하나씩, 구체적으로 어떻게 구하고 어떻게 이용할 것인지 알아보자. 그런데 ! 이 정보들을 구하기에 앞서, 미리 세팅해 두면 편한 또 다른 사항들이 몇 가지 있다.

지금부터는, 미리 세팅해 두면 좋은 그런 정보들에 대해서부터 이야기를 해보자.

 

#2. 대/소문자 변환

우리는 주어진 웹 페이지에서 특정 단어가 몇 번 등장하는지 찾아야 하는 과정이 이 이후에 나올 것이다. 그런데 문제는 이 특정 단어가 대 소문자를 구분하지 않는다는 것이다.

예를 들어서, "Hi HI hi hI" 에서 "Hi" 를 찾으세요 ! 라고 했을 때, 1번 등장하는 것이 아닌, 4번 등장한다고 판단을 해야 한다는 것이다. 즉 ! 대 / 소문자에 대한 구분이 없다.

따라서 본인은 먼저, 주어진 웹페이지를 전부 다 대문자로 바꿔버렸다. 그리고 우리에게 주어지는 찾아야 할 단어 또한 대문자로 바꿔주었다. 그렇게되면 훨씬 더 위의 단어를 찾기 수월할 것이기 때문이다.

이 과정을 코드로 나타낸 부분이다.

string To_Upper(string Str)
{
	transform(Str.begin(), Str.end(), Str.begin(), ::toupper);
	return Str;
}

위에서 사용된 transform 이라는 함수는 조금은 생소한 함수일 수 있다.

transform(A , B , C , D) 는 다음과 같이 실행된다.

"주어진 범위인 A 에서 부터 B 이전까지의 원소들을 'D'로 실행한 후, 그 결과를 C에서 부터 저장하겠습니다."
즉, 위의 코드를 이야기해보면, "주어진 문자열 'Str'을 시작부터 끝까지 모든 원소들을 대문자로 변환(toupper) 시킨 후, 그 결과를 Str의 begin 지점부터 저장하겠습니다" 를 의미한다.

즉 ! 위의 코드를 실행시킨다면, 주어진 단어는 물론, 주어진 웹페이지에 있는 모든 영어들을 대문자로 변환시킬 수 있게 된다.

 

#3. URL 구하기

우리는 이 이후의 과정에서, 어떤 웹페이지가 어떤 웹페이지에 링크를 걸었는지 판단을 해야 하는 경우가 발생한다.

링크점수를 계산할 때, 이 정보들을 알고 있어야 한다.

따라서, 본인은 웹 페이지의 URL을 가장 먼저 구해주었다.

웹 페이지의 URL은 어떻게 구할 수 있을까 ??

바로, "<META PROPERTY=\"OG:URL\" CONTENT=\"HTTPS://" 이후에 나오는 것이 URL이다.

이 부분은 웹페이지의 <head>와 </head> 사이에 존재하는 구문이다.

즉 ! 우리는 이 웹페이지에서 "<META PROPERTY=\"OG:URL\" CONTENT=\"HTTPS://" 를 찾은 후, 그 이후에 나오는 문자열들을 URL이라고 저장을 하면 된다. 코드로 보면 다음과 같다.

string Find_URL(string Str)
{
	string Target = "<META PROPERTY=\"OG:URL\" CONTENT=\"HTTPS://";
	int Idx = Str.find(Target); Idx += Target.length();
	string URL = "";
	while (Str[Idx] != '\"') URL += Str[Idx++];
	return URL;
}

우리가 찾고자 하는 문자열(Target)은 "<META PROPERTY=\"OG:URL\" CONTENT=\"HTTPS://" 이다.

이를 find() 함수를 통해서 찾아낼 수 있다. 이 때 find() 함수가 return 하는 값은, "해당 문자열이 시작되는 Index번호" 를 return 하게 된다. 즉 ! 위의 코드에서 'Idx'라는 변수에 저장된 값은, "<META PROPERTY=\"OG:URL\" CONTENT=\"HTTPS://" 가 시작되는 Idx번호일 것이다. 즉 ! 가장 앞에 있는 '<' 이 문자의 Index번호가 저장될 것이다. 하지만, 우리가 찾고자 하는 것은 ? 이 문자열 이후에 나오는 문자열을 찾고 싶은 것이다.

따라서, Idx의 번호를 "<META PROPERTY=\"OG:URL\" CONTENT=\"HTTPS://"의 길이만큼 + 시켜준다면 ? 이 이후에 나오는 문자열의 Index번호를 Idx라는 변수가 가르키게 될 것이다. 이를 통해서, URL을 구해줄 수 있다.

 

또한 ! 웹페이지의 URL을 string형으로 구했다면, 본인은 이를 int형으로 매핑시켜 주었다.

매핑시키는 과정에서는 자료구조 map을 사용해 주었다. map을 사용해서 "해당 웹페이지와 매핑되는 숫자를 저장" 함으로써 웹페이지의 URL을 string형이 아닌 int형으로 관리해 주었다.

 

지금까지 우리가 진행한 것들에 대해서 이야기해보자.

[ 지금까지 진행한 것들 ]
#1. 웹페이지에서 찾으려는 단어가 대/소문자를 구분하지 않으므로, 찾으려는 단어와 웹페이지의 모든 영어를
     모두 대문자로 변환시켜 주었다.
#2. 웹페이지의 이름을 통해서 정보를 구해야 할 상황이 생길 것이므로, 웹 페이지의 URL을 찾아주었고,
     이 URL을 int형으로 관리하기 위해서, 자료구조 map을 통해서 int형으로 매핑시켜 주었다.

 

#4. 기본 점수 구하기

이제 모든 밑작업이 모두 끝났다. 본격적으로 문제 해결을 위해 필요한 정보들을 구해보자.

가장 먼저, 기본점수를 구해보자.

기본점수는 "주어진 단어가, 해당 웹 페이지에서 등장하는 횟수" 가 해당 웹 페이지의 기본 점수가 된다.

그런데 ! 문제에서 조금 구체적으로 주어지지 않은 부분 중에 하나라고 생각한다.

본인은 문제를 보고, 주어진 웹 페이지에서 <body> 태그 즉, <body> 와 </body> 사이에 있는 문구들 중에서만 이 단어를 찾아보았다.

만약, 본인이 이렇게 구현을 해서 pass를 받지 못했다면, 본인은 이 부분을 찾아야 하는 단어를 <body>태그 사이에서만 찾는 것이 아닌, 전체 웹페이지의 단어들에서 찾는 방식으로 수정을 했을 것이다.

예를 들어서, 우리가 찾아야 하는 단어가 "Hi" 인데, 우리가 #3에서 구한 URL의 이름이 "Hi.com" 이런 경우가 있다면, 이는 body태그 사이에 있는 내용이 아니기 때문에 카운트 되지 않을 것이고, 제대로된 기본점수를 구할 수 없었을 것이다. 하지만 ! 결론부터 말하자면, <body>와 </body> 사이, 즉 ! body태그 안에서만 주어진 단어를 찾는 방식으로 구현을 하더라도 pass를 받을 수 있다.

 

그리고 주어진 단어를 찾을 때는, 알파벳이 아닌 모든 문자 혹은 띄어쓰기로만 판단을 한다고 되어있다.

즉 ! Hi를 찾는데, HIHIHIHIHIHI가 있다면, 여기서는 HI가 0번 등장하는 것이다.

정리해보면, <body>와 </body> 사이에서, 알파벳을 제외한 다른 문자 혹은 띄어쓰기로 단어들을 잘라봤을 때, 주어진 단어가 등장하는 횟수를 카운트 해주면 된다.

이를 코드로 나타내면 다음과 같다.

int Find_Word(string Str)
{
	string Target1 = "<BODY>";
	string Target2 = "/<BODY>";
	int Idx1 = Str.find(Target1); Idx1 += Target1.length();
	int Idx2 = Str.find(Target2);
	Str = Str.substr(Idx1, Idx2 - Idx1);

	string Cur = "";
	int Cnt = 0;
	for (int i = 0; i < Str.length(); i++)
	{
		if (isalpha(Str[i]) == 0)
		{
			if (Cur == Word) Cnt++;
			Cur = "";
		}
		else Cur += Str[i];
	}
	return Cnt;
}

마찬가지로, find() 함수를 이용해서, <BODY>와 </BODY>를 찾아주었다. 그리고 이 사이의 데이터들에 대해서만 탐색을 진행하였다.

line13)에서 보면, isalpha() 라는 함수를 사용하였는데, 이 함수는 주어진 문자가 알파벳 소문자면 2, 알파벳 대문자면 1 알파벳이 아니라면 0을 반환해 주는 함수이다.

즉 ! 알파벳을 제외한 모든 다른 문자들(띄어쓰기 = 공백 포함)을 만나게 되면, 지금까지 나온 문자가 주어진 단어와 같은지 확인하는 식으로 구현해 주었다.

 

#5. 외부 링크 구하기

이제 웹 페이지에서 외부링크수를 구해보자.

외부링크의 URL은 어디에 적혀있을까 ?? 바로  "<A HREF=\"HTTPS://" 이 문구 다음에 나오는 것이 사이트가 이 웹페이지가 링크를 걸어놓은 외부링크들이다.

지금까지 했던 것과 마찬가지로, 우리는  "<A HREF=\"HTTPS://" 이 문자열을 찾는 것을 기준으로 외부로 걸린 웹페이지들의 URL을 찾아낼 수 있을 것이다.

그런데 ! 문제는, 외부링크가 몇 개가 걸려있는지 모른다는 것이다. 여러 개의 사이트가 걸려있을 수도 있기 때문에, 계속해서 반복적으로,  "<A HREF=\"HTTPS://" 이 문구를 찾아주어야 한다.

여기서, find() 함수에 대해서 조금 더 구체적으로 이야기를 해보자.

find(Str)을 하게 되면, 주어진 문자열에서, Str을 찾아서, 이 Str이 시작되는 첫 번째 단어의 Index번호를 return 한다고 이야기 했었다. 그런데 만약에 ! 주어진 문자열에서 'Str'이 라는 문자열이 없다면 무슨 값을 return 해줄까 ??

단순하게 -1을 return 한다고 생각해도 되지만, 실제로 출력을 해보면 '이상한 숫자'를 출력해준다. 심지어, int형의 범위를 넘어서는 정체 모를 숫자를 return 해준다.

그렇기 때문에, 만약 내가 구현하고 싶은 내용이 "주어진 문자열에서, "Str"을 찾지 못한다면 ?" 을 구현하려면 다음과 같이 구현할 수 있다.

int Idx = Str.find(찾으려는 문자열)
if(Idx == Str.npos)
{
	"찾으려는 문자열을 찾을 수 없습니다."
}

'Str.npos' 라는 것을 사용해 주었는데, 이는 -1을 의미하는 상수라고 한다. 그리고, find()함수에서 원하는 데이터를 찾지 못했을 때는, npos라는 값을 return 해준다고 한다. 위의 조건문에서 Idx == -1 이라고 해도 사실 무방하다.

 

다시 본론으로 돌아와서, 지금 이 얘기를 왜 했을까 ??

외부로 걸린 링크가 여러개일 수 있기 때문에, 계속해서 찾다보면 "<A HREF=\"HTTPS://" 이 문구를 더 이상 찾지 못하는 경우가 발생하게 될 것이다. 이 경우에는 탐색을 그만하는 것을 말하기 위해서 지금까지 이런 이야기를 한 것이다.

본인은, 이런 방식으로 찾아낸 외부로 걸린 URL들을 vector에 저장을 해 주었다.

그리고, 이 후에 이 Vector에 저장되어 있는 URL주소들을 토대로 연결되어 있는 사이트의 또 다른 점수를 계산하는데 사용해 주었다.코드로 나타내면 다음과 같다.

vector<string> Find_Out_Link(string Str)
{
	vector<string> Result;
	string Target = "<A HREF=\"HTTPS://";
	int Idx = Str.find(Target); 
	while (Idx != Str.npos)
	{
		Idx += Target.length();
		string Cur = "";
		while (Str[Idx] != '\"') Cur += Str[Idx++];
		Result.push_back(Cur);
		Str = Str.substr(Idx);
		Idx = Str.find(Target);
	}
	return Result;
}

 

#6. 정보들 묶어서 관리하기

지금까지 우리가 구한 정보들을 요약해보자.

1. #3) : 현재 웹 페이지의 URL 주소가 무엇인지 구해주었다. 또한, 이 URL을 주소를 int형으로 매핑시켜 주었다.

2. #4) : 현재 웹 페이지에서 주어진 단어가 몇 번 등장하는지 Count하는 과정을 통해서 "기본점수" 를 구해주었다.

3. #5) : 현재 웹 페이지가 외부로 걸어놓은 링크들의 이름을, vector에 저장을 해 주었다. 이 Vector의 Size()를 통해서

          이 웹 페이지의 외부 링크 수를 구할 수 있다.

본인은 이 정보들을 모두 한꺼번에 관리를 해주기 위해서 구조체를 하나 선언해 주었다. 다음과 같은 구조체이다.

struct PAGE
{
	int Idx;
	int Basic_Point;
	vector<string> Out_Link_List;
	double Link_Point;
	double Match_Point;
};

멤버변수 'Idx'는 최종적으로 출력을 위한 멤버변수이다. 매칭점수가 같은 경우에는, Index번호가 가장 작은 웹페이지를 출력을 해야 하는데, 이를 위해서 만들어 놓은 Index변수이다.

'Basic Point" 는 기본점수를 의미한다.

vector<string> Out_Link_List 는 우리가 #5에서 구해놓은 외부로 걸어놓은 링크들의 URL 주소들이 저장되어 있는 Vector 이다. Link_Point와 Match_Point는 아직 구하지 않는 변수들이기 때문에 이후에 차근차근 확인을 해보자.

 

그럼, 지금까지 구해놓은 정보들이 이 구조체에 어떻게 저장되어 있는지 확인을 해보자.

struct PAGE
{
	int Idx;
	int Basic_Point;
	vector<string> Out_Link_List;
	double Link_Point;
	double Match_Point;
};

vector<PAGE> Page;

void Function(vector<string> V)
{
	for (int i = 0; i < V.size(); i++)
	{
		string Str = To_Upper(V[i]);
		string URL = Find_URL(Str);
		Page_Num[URL] = i + 1;
		int BP = Find_Word(Str);
		vector<string> Out_Link = Find_Out_Link(Str);
		Page.push_back({ i, BP, Out_Link, 0.0, 0.0 });
	}
}

위와 같이 관리를 해 주었다. Function 함수의 매개변수 'V'는 우리에게 주어지는 'pages' 변수이다.

주어진 웹 페이지를 모두 대문자로 변환해 주었고, 웹 페이지의 URL 주소를 구했으며, 이 URL주소를 int형으로 관리하기 위해서 자료구조 map을 이용해서 매핑시켜주었다.

또한, 기본점수를 구해주었고, 외부로 연결되어 있는 링크들의 URL 주소들을 vector에 저장해 주었다.

그리고 이 모든 정보들을 구조체로 만들어서 구조체 vector에 삽입을 해주는 과정이 위의 코드이다.

이제 우리는 이 정보들을 토대로, 링크점수와 매치점수만 구하면 된다.

 

#7. 링크점수 구하기

간단하게 생각하면 된다. 웹 페이지의 링크점수는 "나를 링크 걸어놓은 웹페이지의 기본점수 / 외부 링크 수" 의 총합이다. 즉, 내가 웹 페이지 'A' 인데, 웹 페이지 'B'와 'C'가 나를 링크를 걸어놓았다.

그렇다면, 'A'의 링크점수는 "B의 기본점수 / 외부링크 수 + C의 기본점수 / 외부링크 수" 가 되는 것이다.

그리고 우리는, 위의 구조체 Vector에 기본점수와 외부링크에 대해서 모두 구해놓았다.

따라서 다음과 같이 링크 점수를 구할 수가 있다.

void Calculate_Link_Point()
{
	for (int i = 0; i < Page.size(); i++)
	{
		vector<string> V = Page[i].Out_Link_List;
		int Size = V.size();
		for (int j = 0; j < V.size(); j++)
		{
			string Str = V[j];
			if (Page_Num[Str] == 0) continue;
			int Target_Idx = Page_Num[Str] - 1;
			Page[Target_Idx].Link_Point += ((double)Page[i].Basic_Point / (double)Size);
		}
	}
}

line3) 에서 우리가 저장해놓은 구조체 Vector들을 순차적으로 탐색할 것이다.

line7) 에서는, 해당 웹 페이지가 외부로 걸어놓은 링크들을 저장해 놓은 vector를 순차적으로 탐색을 하는 과정이다.

물론, 주어지지 않은 웹 페이지에 대해서는 계산이 필요하지 않을 것이다. 우리는 이를 line 10)을 통해서 확인할 수 있다.

우리는 페이지의 URL 주소인 string형을 map을 통해서 int형으로 매핑시켜 놓았다. 하지만, 주어지지 않은 웹 페이지라면, 당연히 매핑되어 있지 않을 것이고 초기값인 0으로 설정되어 있을 것이다.

따라서, line10)을 통해서 주어지지 않은 웹 페이지에 대해서는 그냥 넘어가도록 구현을 해 주었다.

그게 아닌 경우에는, line11 ~ 12)를 통해서 링크 점수를 계산해 주었다.

 

#8. 매치점수 구하기

링크점수까지 구했으면, 이제 정말 다 구했다. 매치 점수는 웹 페이지의 기본점수 + 링크점수가 된다.

간단한 연산을 통해서 이를 구할 수가 있다.

구한 후에는, 매칭점수가 가장 높은 웹페이지를, 그런 웹 페이지가 여러개라면, index번호가 가장 빠른 웹페이지를 출력을 해주면 된다. 우리는 모든 정보를 구해놓았기 때문에 구해놓은 정보들을 조건에 맞는 방식으로 정렬만 시켜주게 된다면 정답을 도출할 수 있다.

void Calculate_Link_Point()
{
	for (int i = 0; i < Page.size(); i++)
	{
		vector<string> V = Page[i].Out_Link_List;
		int Size = V.size();
		for (int j = 0; j < V.size(); j++)
		{
			string Str = V[j];
			if (Page_Num[Str] == 0) continue;
			int Target_Idx = Page_Num[Str] - 1;
			Page[Target_Idx].Link_Point += ((double)Page[i].Basic_Point / (double)Size);
		}
	}
	for (int i = 0; i < Page.size(); i++)
	{
		Page[i].Match_Point = (double)Page[i].Basic_Point + (double)Page[i].Link_Point;
	}
	sort(Page.begin(), Page.end(), Cmp);
}

#7의 과정에서 조금 더 추가된 과정이다.

 

#9. 최종 정리

너무 많은 이야기를 했으니 깔끔하게 정리를 한번 하고 최종 소스코드를 확인해 보도록 하자.

  •  1. 우리는 [ 웹페이지의 Index번호 , 기본점수 , 외부링크 수 , 링크 점수 , 매칭 점수 ] 를 구해야 하기 때문에, 이를
  •     한번에 통합해서 관리해 주기 위한 구조체를 하나 선언해 주었다.   
  •  2. 웹 페이지의 URL을 vector의 Index번호로 활용하기 위한 것과, 링크 점수를 계산할 때, 간단하게 int형으로
  •     접근 하는 과정을 위해서 주어진 URL을 자료구조 map을 통해서 int형으로 매핑시키는 과정을 진행해 주었다.
  •  3. 웹 페이지에서 등장하는 단어의 수를 Count 해줌으로써, 웹 페이지의 기본점수를 구하였다.
  •  4. 웹 페이지에서 외부로 연결된 링크들을 vector에 저장해줌으로써, 외부 링크 및 외부 링크 수에 대해서 
  •     구하였다.
  •  5. 주어진 기본점수와 외부링크수를 통해서 링크점수를 구하였다.
  •  6. 주어진 기본점수와 링크점수를 통해서 매칭 점수를 구하였다.
  •  7. 매칭점수와 Index번호를 기준으로 정렬을 시켜서 최종 정답을 도출하였다

 

[ 소스코드 ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include <string>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
 
// 링크점수 = 기본점수 / 외부링크수
struct PAGE
{
    int Idx;
    int Basic_Point;
    vector<string> Out_Link_List;
    double Link_Point;
    double Match_Point;
};
 
string Word;
map<stringint> Page_Num;
vector<PAGE> Page;
 
bool Cmp(PAGE A , PAGE B)
{
    if (A.Match_Point >= B.Match_Point)
    {
        if (A.Match_Point == B.Match_Point)
        {
            if (A.Idx < B.Idx)
            {
                return true;
            }
            return false;
        }
        return true;
    }
    return false;
}
 
string To_Upper(string Str)
{
    transform(Str.begin(), Str.end(), Str.begin(), ::toupper);
    return Str;
}
 
string Find_URL(string Str)
{
    string Target = "<META PROPERTY=\"OG:URL\" CONTENT=\"HTTPS://";
    int Idx = Str.find(Target); Idx += Target.length();
    string URL = "";
    while (Str[Idx] != '\"') URL += Str[Idx++];
    return URL;
}
 
int Find_Word(string Str)
{
    string Target1 = "<BODY>";
    string Target2 = "/<BODY>";
    int Idx1 = Str.find(Target1); Idx1 += Target1.length();
    int Idx2 = Str.find(Target2);
    Str = Str.substr(Idx1, Idx2 - Idx1);
 
    string Cur = "";
    int Cnt = 0;
    for (int i = 0; i < Str.length(); i++)
    {
        if (isalpha(Str[i]) == 0)
        {
            if (Cur == Word) Cnt++;
            Cur = "";
        }
        else Cur += Str[i];
    }
    return Cnt;
}
 
vector<string> Find_Out_Link(string Str)
{
    vector<string> Result;
    string Target = "<A HREF=\"HTTPS://";
    int Idx = Str.find(Target); 
    while (Idx != -1)
    {
        Idx += Target.length();
        string Cur = "";
        while (Str[Idx] != '\"') Cur += Str[Idx++];
        Result.push_back(Cur);
        Str = Str.substr(Idx);
        Idx = Str.find(Target);
    }
    return Result;
}
 
void Calculate_Link_Point()
{
    for (int i = 0; i < Page.size(); i++)
    {
        vector<string> V = Page[i].Out_Link_List;
        int Size = V.size();
        for (int j = 0; j < V.size(); j++)
        {
            string Str = V[j];
            if (Page_Num[Str] == 0continue;
            int Target_Idx = Page_Num[Str] - 1;
            Page[Target_Idx].Link_Point += ((double)Page[i].Basic_Point / (double)Size);
        }
    }
    for (int i = 0; i < Page.size(); i++)
    {
        Page[i].Match_Point = (double)Page[i].Basic_Point + (double)Page[i].Link_Point;
    }
    sort(Page.begin(), Page.end(), Cmp);
}
 
void Function(vector<string> V)
{
    for (int i = 0; i < V.size(); i++)
    {
        string Str = To_Upper(V[i]);
        string URL = Find_URL(Str);
        Page_Num[URL] = i + 1;
        int BP = Find_Word(Str);
        vector<string> Out_Link = Find_Out_Link(Str);
        Page.push_back({ i, BP, Out_Link, 0.00.0 });
    }
    Calculate_Link_Point();
}
 
int solution(string word, vector<string> pages)
{
    int answer = 0;
    Word = To_Upper(word);
    Function(pages);
    answer = Page[0].Idx;
    return answer;
}
cs

+ Recent posts