https://programmers.co.kr/learn/courses/30/lessons/42893
이문제를 풀때 주어진 데이터에서 필요한 정보를 가져와야한다.
다음과 같은 방식으로 구해줄수있다.
"나의나이는26입니다." 문자열에서 "26살" 을 가져와보자.
String a = "나의나이는26살입니다.";
String Text = "나의나이는";
// a.indexOf(Text) 는 a 문자열에서 Text(나의나이는) 이 시작되는 index 를 리턴한다.
// a.indexOf(Text) 에서 Text.length() 를 더해주면 문자열 a 에서 나의나이는 다음 문자의
// index 를 구할수 있다.
int startPoint = a.indexOf(Text) + Text.length();
// a.indexOf('찾을 문자열', 시작인덱스(int)) 두번째 인자가 생략되있을 경우 0번째(처음부터) 부터 찾을
// 문자열을 찾아 index 값을 리턴해주고 아래와 같이 생략되어있지 않을때는 두번째 인자값부터 값을 찾는다.
// startPoint 부터 a 문자열의 "입니다." 가 시작되는 인덱스를 구해준다.
int endPoint = a.indexOf("입니다.", startPoint);
// substring 을 이용해서 원하는 문자열을 뽑아올수있다.
a.substring(startPoint, endPoint); => 26살
이문제를 풀때 기본점수는 특정 word 문자열이 몇개 포함되어있냐로 점수를 매긴다.
이를 해결하기위해 다음과같이 처리를 하였다.
String content = page.substring(startPoint, endPoint);
for(int i = 0; i < content.length(); i++) {
char c = content.charAt(i);
// 해당 문자가 문자가 아닐경우 공백으로 대체한다.
if(c < 'a' || c > 'z') {
content = content.replace(c, ' ');
}
}
// 공백을 기준으로 문자열배열로 만들어 해당단어가 포함된 수를 카운팅한다.
String[] temp = content.split(" ");
for(int i = 0; i < temp.length; i++) {
if(temp[i].equals(word)) {
score++;
}
}
위 문제에서 외부 링크는 여러개일수 있기때문에 모든 링크정보를 가져와야한다.
indexOf("찾을 문자열", 시작인덱스) 를 활용하여 더이상 링크를 찾을수 없을때까지
반복하여 모든 링크정보를 구했다.
ArrayList<String> links = new ArrayList<String>();
String link = "<a href=\"";
int sp = 0; //처음에는 0 번째 index 부터 탐색
while(true) {
int new_sp = page.indexOf(link, sp) + link.length();
int new_ep = page.indexOf("\"", new_sp);
if(new_sp == link.length() - 1) break; // sp 가 -1 이되어 더이상 찾을수없다면 종료
sp = new_sp; // 링크를 찾았다면 sp 를 갱신해준다.
links.add(page.substring(new_sp, new_ep));
}
다음은 전체 코드이다.
import java.util.ArrayList;
import java.util.Collections;
public class Solution {
public static int solution(String word, String[] pages) {
int answer = 0;
ArrayList<WebPage> list = new ArrayList<WebPage>();
for(int i = 0; i < pages.length; i++) {
int index = i;
String pageText = pages[i].toLowerCase();
word = word.toLowerCase();
String url = getUrl(pageText);
double nomalScore = getNomalScore(pageText, word);
ArrayList<String> links = getLinks(pageText);
list.add(new WebPage(index, url, nomalScore, links));
}
for(int i = 0; i < list.size(); i++) {
ArrayList<String> temp = list.get(i).links;
for(int j = 0; j < list.size(); j++) {
if(i != j) {
if(temp.contains(list.get(j).url)) {
list.get(j).totalScore += (double)(list.get(i).nomalScore / (double)list.get(i).links.size());
}
}
}
}
Collections.sort(list, (a, b)->{
if(a.totalScore == b.totalScore) {
return a.index - b.index;
}
if(a.totalScore < b.totalScore){
return 1;
}else{
return -1;
}
});
return list.get(0).index;
}
public static String getUrl(String page) {
String urlText = "<meta property=\"og:url\" content=\"";
int startPoint = page.indexOf(urlText) + urlText.length();
int endPoint = page.indexOf("\"", startPoint);
return page.substring(startPoint, endPoint);
}
public static double getNomalScore(String page, String word) {
String body = "<body>";
int score = 0;
int startPoint = page.indexOf(body) + body.length();
int endPoint = page.indexOf("</body>", startPoint);
String content = page.substring(startPoint, endPoint);
for(int i = 0; i < content.length(); i++) {
char c = content.charAt(i);
if(c < 'a' || c > 'z') {
content = content.replace(c, ' ');
}
}
String[] temp = content.split(" ");
for(int i = 0; i < temp.length; i++) {
if(temp[i].equals(word)) {
score++;
}
}
return score;
}
public static ArrayList<String> getLinks(String page){
ArrayList<String> links = new ArrayList<String>();
String link = "<a href=\"";
int sp = 0;
while(true) {
int new_sp = page.indexOf(link, sp) + link.length();
int new_ep = page.indexOf("\"", new_sp);
if(new_sp == link.length() - 1) break;
sp = new_sp;
links.add(page.substring(new_sp, new_ep));
}
return links;
}
}
class WebPage{
int index;
String url;
double nomalScore;
ArrayList<String> links;
double totalScore;
WebPage(int index, String url, double nomalScore, ArrayList<String> links){
this.index = index;
this.url = url;
this.nomalScore = nomalScore;
this.links = links;
this.totalScore = nomalScore;
}
}
'프로그래머스' 카테고리의 다른 글
프로그래머스_카카오인턴십_경주로건설_자바 (0) | 2020.07.02 |
---|---|
프로그래머스_카카오인턴십_보석쇼핑_자바 (0) | 2020.07.02 |
프로그래머스_배달_자바 (0) | 2020.06.16 |
프로그래머스_후보키_자바 (0) | 2020.06.14 |
프로그래머스_JadenCase_자바 (0) | 2020.06.07 |