728x90
소요시간이 많이 걸린 구현 문제였다.
https://school.programmers.co.kr/learn/courses/30/lessons/42893
특별한 알고리즘이 필요한 문제는 아니었고 문제에서 구현하라는 대로 풀면 되는 문제였는데 예외 케이스 때문에 스스로는 해결하지 못한 문제였다.
문제의 풀이 자체는 아래와 같다.
1. meta 태그에서 현재 url을 가져옴
2. a태그들을 파싱하여 외부 링크를 가져옴
3. 현재 기본 점수들을 확인함
4. 객체 형태로 외부링크,점수,최종 점수를 저장함. 이때 최종점수의 초기값은 기본점수로 함
5. 객체를 순회하며 외부링크가 있는 경우 해당 외부링크의 최종점수에 현재 점수 / 현재외부링크 수 를 더해줌
6. 가장 점수가 높은 page의 idx를 반환
문제 자체는 작은 여러가지 문제들이 합쳐진 꼴인데 2가지 정도 큰 문제가 있었다. 해당 부분을 스스로 해결하지 못해 외부의 도움을 받았다 ㅠ
1. https:// 꼴로 시작하지 않는 URL이 존재. -> https: 를 정규표현식 안에 넣어서 해결
2. 유효하지 않은 url 형태가 존재 -> .+가 아닌 \S*를 활용하여 빈칸등의 유효하지 않은 URL을 걸러냄
function solution(word, pages) {
word = word.toLowerCase(); // 단어는 소문자만 비교
const pageInfo = new Map(); // 페이지의 정보를 map자료형으로 저장
//meta 태그에서 현재 url을 가져옴
const getCurUrl = (page) =>
page.match(/<meta property="og:url".+>/g)[0].match(/"https:\/\/.+"/g)[0];
//a태그들에서 주소값들만 가져옴
const getLinkUrl = (page) => {
// const aTag = page.match(/<a href="https:\S*"/gi)
const aTag = page.match(/<a href="https:.+">/gi);
return aTag ? aTag.map((str) => str.match(/"https:\/\/.+"/g)[0]) : [];
};
//기본점수를 구함 (단어단위로 자르고 word와 일치하는것만 분리)
const getBasicScore = (page) => {
page = page.toLowerCase();
return page.match(/[a-z]+/g).filter((v) => v === word).length;
};
//객체생성 + 기본점수 구하기
pages.forEach((page, idx) => {
const pageURL = getCurUrl(page);
const point = getBasicScore(page);
const outLinks = getLinkUrl(page);
pageInfo.set(pageURL, { point, outLinks, idx, matchPoint: point });
});
//외부링크와 연관된 점수 더하기
for (const [url, info] of pageInfo) {
for (const link of info.outLinks) {
const linkInfo = pageInfo.get(link);
if (linkInfo) linkInfo.matchPoint += info.point / info.outLinks.length;
}
}
//최대값 구하기
let max = 0;
let ret = 0;
for (const [url, info] of pageInfo) {
if (info.matchPoint > max) {
ret = info.idx;
max = info.matchPoint;
}
}
return ret;
}
728x90
'FrontEnd > 프로그래머스' 카테고리의 다른 글
[JS] 디스크 컨트롤러 (0) | 2024.01.30 |
---|---|
[JS] 섬 연결하기 (0) | 2024.01.26 |
[JS] N으로 표현 (2) | 2024.01.23 |
[JS] 산 모양 타일링 (카카오 겨울 인턴십) (0) | 2024.01.19 |
[JS] 이중우선순위큐 (0) | 2024.01.17 |