프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
코드
import java.util.*;
class Solution {
static class Page{
private int index;
private String url;
private double baseScore;
private double linkScore;
private double linkScoreForOther;
private final List<String> linkList;
Page(int index){
this.index = index;
this.baseScore = 0.0;
this.linkScore = 0.0;
linkList = new ArrayList<>();
}
public void setLinkScoreForOther() {
this.linkScoreForOther = baseScore / linkList.size();
}
}
public int solution(String word, String[] pages) {
int answer = 0;
Page[] pageList = new Page[pages.length];
Map<String, Integer> urlMap = new HashMap<>();
// index 기준 파싱
int idx = 0;
for (String page : pages) {
pageList[idx] = new Page(idx);
// 본인 url get
String url = page.split("<meta property=\"og:url\" content=\"",2)[1];
url = url.split("\"",2)[0];
pageList[idx].url = url;
urlMap.put(url, idx);
// 외부 링크 url get
String[] splited = page.split("<a href=\"");
for (String s: splited) {
if (s.startsWith("https"))
pageList[idx].linkList.add(s.split("\"",2)[0]);
}
// 기본 점수 get
splited = page.split("<body>|</body>");
String text = splited[1];
splited = text.split("\\W|\\n|\\d");
for (String s : splited) {
if (s.equalsIgnoreCase(word))
pageList[idx].baseScore++;
}
// 링크 점수 forOther get
pageList[idx++].setLinkScoreForOther();
}
// 링크 점수 get : 입력이 다 끝난 후에 확인이 가능한 과정
for (Page page : pageList) {
for (String s : page.linkList) {
if (urlMap.get(s) != null) // pages 에 존재하는 url 이라면
pageList[urlMap.get(s)].linkScore += page.linkScoreForOther;
}
}
// 매칭 점수 비교
double max = 0.0;
for (Page page : pageList) {
double matchingScore = page.baseScore + page.linkScore;
if (max < matchingScore) { // 매칭 점수가 같다면, 제일 작은 Index
max = matchingScore;
answer = page.index;
}
}
return answer;
}
}
변수
- Class 변수
- index : 웹페이지의 인덱스
- url : 한 웹페이지의 url
- baseScore : 기본 점수
- linkScore : 링크 점수
- linkScoreForOther : 한 웹페이지 기준 다른 웹페이지의 링크 점수 계산에 사용되는 점수
[ 예시 ] 링크 점수의 계산
: a.com의 링크점수는 b.com으로부터 0.5점, c.com으로부터 1점 - linkList : 한 웹페이지당 외부 링크 url 리스트
- 함수 변수
- pageList : Page 객체 배열
- urlMap : < key : url, value : url의 인덱스 >
기능
- 웹페이지 url 파싱
1. String url = page.split("<meta property=\"og:url\" content=\"",2)[1];
: <meta property=\"og:url\" content=\" 를 기준으로 웹페이지를 2개로 나눔
2. url = url.split("\"",2)[0];
: " 를 기준으로 문자열 https://a.com"/> 를 2개로 나눔 -> [0] 에 https://a.com 이 저장됨
3. 웹페이지 url 저장, Map 매핑
- 외부 링크 url 파싱
: 페이지 url 구할 때랑 같은 방식으로 파
- 기본 점수 얻기
- 파싱은 이전과 비슷
- 정규 표현식 사용 ( 따로 작성할 예정 )
- equalsIgnoreCase() : 대소문자 구별 안함 ( 정규 표현식으로 해결 가능 )
- 링크 점수 얻기
1. 0 ~ n 인덱스까지의 page 객체를 순회
2. page 객체별 외부 링크를 확인하여 입력으로 주어진 pages에 속해 있는 url인지 확인
: if (urlMap.get(s) != null)
3. 속해 있는 경우, Map을 활용해 인덱스를 찾아 해당 page객체를 찾고
링크 점수에 linkScoreForOther을 더함
- 매칭 점수 비교
- [ 조건 ] 매칭 점수가 가장 작은 인덱스 반환, 점수가 같을 시 가장 작은 인덱스 반환
: if (max < matchingScore)
- [ 조건 ] 매칭 점수가 가장 작은 인덱스 반환, 점수가 같을 시 가장 작은 인덱스 반환
소감
정규 표현식, Compiler/Matcher 공부
split을 쓰는게 더 편하긴 하지만, Compiler와 Mather를 더 많이 사용하고, 직관적임을 보았다.
'Problem Solving' 카테고리의 다른 글
[ 백준 ] 22859 HTML 파싱 (정규표현식 풀이) (0) | 2023.02.04 |
---|---|
[ 프로그래머스 / java ] 후보키 ( 2019 KAKAO BLIND RECRUITMENT ) (0) | 2023.01.25 |
[ 프로그래머스 / java ] 길 찾기 게임 ( 2019 KAKAO BLIND RECRUITMENT ) (0) | 2023.01.15 |
C++) 백준 1759 암호 만들기 (0) | 2022.12.21 |
C++) 백준 20055 컨베이어 벨트 위의 로봇 (0) | 2022.08.06 |