FrontEnd/프로그래머스

[JS] 매칭 점수

728x90

소요시간이 많이 걸린 구현 문제였다.

 

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

 

프로그래머스

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

programmers.co.kr

 

 

특별한 알고리즘이 필요한 문제는 아니었고 문제에서 구현하라는 대로 풀면 되는 문제였는데 예외 케이스 때문에 스스로는 해결하지 못한 문제였다.

 

문제의 풀이 자체는 아래와 같다.

 

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