프로그래머스

프로그래머스_매칭점수_자바

o늘do 2020. 7. 1. 01:30

 

https://programmers.co.kr/learn/courses/30/lessons/42893

 

코딩테스트 연습 - 매칭 점수

매칭 점수 프렌즈 대학교 조교였던 제이지는 허드렛일만 시키는 네오 학과장님의 마수에서 벗어나, 카카오에 입사하게 되었다. 평소에 관심있어하던 검색에 마침 결원이 발생하여, 검색개발팀�

programmers.co.kr

이문제를 풀때 주어진 데이터에서 필요한 정보를 가져와야한다.

다음과 같은 방식으로 구해줄수있다. 

"나의나이는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;
	}
}