본문 바로가기
코딩테스트/프로그래머스

[2019 KAKAO BLIND RECRUITMENT] 매칭 점수

by 의정부핵꿀밤 2022. 10. 13.
728x90

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


1.Pattern 클래스

  • 정규 표현식이 컴파일 된 클래스
  • 정규 표현식에 대상 문자열을 검증하거나 활용하기 위해 사용되는 클래스

 

 

주요 메소드

 

 

 

2. Matcher 클래스

  • Pattern 클래스를 받아 대상 문자열과 패턴이 일치하는 부분을 찾거나, 전체 일치 여부 등을 판별하기 위해 사용된다

 

주요 메소드

 


Link 클래스

    class Link {
        String url; //자기 자신 링크
        String[] extUrls; //외부 링크들
        double point, linkPoint; //기본 점수, 링크 점수
        int index; //인덱스
        
        public Link(int index, String url) {
            this.index = index;
            this.url = url;
        }
        
        public void setExtUrls(ArrayList<String> urls) {
            this.extUrls = new String[urls.size()];
            for(int i=0; i<urls.size();i++) {
                extUrls[i] = urls.get(i);
            }
        }
        
        public void setLinkPoint() {
            this.linkPoint = this.point / extUrls.length;
        }
    }
  • 링크들에 대한 정보를 저장하는 클래스
  • url : 자기 자신의 링크 이름을 저장한다
  • extUrls : 해당 링크에 걸린 외부 링크들의 리스트를 저장한다
  • point : 해당 링크의 기본 점수
  • linkPoint : 해당 링크의 링크 점수

 

 

 

전체 코드)

import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Solution {
    HashMap<String, Link> Links;
    
    public int solution(String word, String[] pages) {
        int answer = 0;
        Links = new HashMap<>();
        
        Pattern homeUrlPattern = Pattern.compile("<meta property=\"og:url\" content=\"(\\S*)\""); //자기 자신의 url 링크 추출
        Pattern urlPattern = Pattern.compile("<a href=\"https://(\\S*)\""); //외부 링크 추출
        Pattern wordPattern = Pattern.compile("\\b(?i)"+word+"\\b"); //단어 언급 수 (기본점수)
        Matcher urlMatcher, wordMatcher, homeUrlMatcher;
        
        ArrayList<String> extUrls;
        Link newLink;
        String body;
        String homeUrl = "";
        
        for(int i=0;i<pages.length;i++) {
            urlMatcher = urlPattern.matcher(pages[i]);
            homeUrlMatcher = homeUrlPattern.matcher(pages[i]);
            
            if(homeUrlMatcher.find()) {
                System.out.println(homeUrl);
                homeUrl = homeUrlMatcher.group().split("=")[2].replaceAll("\"", "");
                System.out.println(homeUrl);
            }
            
            newLink = new Link(i, homeUrl);
            extUrls = new ArrayList<>();
            
            // 외부 링크 저장
            while(urlMatcher.find()) {
                extUrls.add(urlMatcher.group().split("\"")[1]);
            }
            newLink.setExtUrls(extUrls);
            
            // 기본 점수 계산
            body = pages[i].split("<body>")[1].split("</body>")[0].replaceAll("[0-9]", " ");
            wordMatcher = wordPattern.matcher(body);
            int wordCnt = 0;
            while(wordMatcher.find()) {
                wordCnt++;
            }
            newLink.point = wordCnt;
            newLink.setLinkPoint();
            Links.put(newLink.url, newLink);
        }
            
        // 외부 링크 점수 계산
            for(Link link: Links.values()){
                for(String extUrl : link.extUrls){
                    if(Links.containsKey(extUrl)){
                        Links.get(extUrl).point += link.linkPoint;
                    }
                }
            }
        
        // 가장 큰 값을 갖는 링크 계산
            double max_point = 0;
            for(Link link: Links.values()){
                if(link.point == max_point){
                    if(link.index < answer)
                        answer = link.index;
                }
                else if(link.point > max_point) {
                    answer = link.index;
                    max_point = link.point;
                }
            }
        
        return answer;
    }
    
    class Link {
        String url; //자기 자신 링크
        String[] extUrls; //외부 링크들
        double point, linkPoint; //기본 점수, 링크 점수
        int index; //인덱스
        
        public Link(int index, String url) {
            this.index = index;
            this.url = url;
        }
        
        public void setExtUrls(ArrayList<String> urls) {
            this.extUrls = new String[urls.size()];
            for(int i=0; i<urls.size();i++) {
                extUrls[i] = urls.get(i);
            }
        }
        
        public void setLinkPoint() {
            this.linkPoint = this.point / extUrls.length;
        }
    }
}

 


솔직히,, 이런 문제 나오면,,,

안 풀고 다른 문제 풀 것 같아요😥😥

728x90

댓글