JavaScript - 프로그래머스 레벨 : 1(20) - ORDER BY '정답률'

먹보·2023년 2월 17일
0
post-thumbnail

1. 카드 뭉치

문제 설명

코니는 영어 단어가 적힌 카드 뭉치 두 개를 선물로 받았습니다. 코니는 다음과 같은 규칙으로 카드에 적힌 단어들을 사용해 원하는 순서의 단어 배열을 만들 수 있는지 알고 싶습니다.

  • 원하는 카드 뭉치에서 카드를 순서대로 한 장씩 사용합니다.
  • 한 번 사용한 카드는 다시 사용할 수 없습니다.
  • 카드를 사용하지 않고 다음 카드로 넘어갈 수 없습니다.
  • 기존에 주어진 카드 뭉치의 단어 순서는 바꿀 수 없습니다.

예를 들어 첫 번째 카드 뭉치에 순서대로 ["i", "drink", "water"], 두 번째 카드 뭉치에 순서대로 ["want", "to"]가 적혀있을 때 ["i", "want", "to", "drink", "water"] 순서의 단어 배열을 만들려고 한다면 첫 번째 카드 뭉치에서 "i"를 사용한 후 두 번째 카드 뭉치에서 "want"와 "to"를 사용하고 첫 번째 카드뭉치에 "drink"와 "water"를 차례대로 사용하면 원하는 순서의 단어 배열을 만들 수 있습니다.
문자열로 이루어진 배열 cards1, cards2와 원하는 단어 배열 goal이 매개변수로 주어질 때, cards1과 cards2에 적힌 단어들로 goal를 만들 있다면 "Yes"를, 만들 수 없다면 "No"를 return하는 solution 함수를 완성해주세요.

예제

코드

function solution(cards1, cards2, goal) {
    for (let i = 0 ; i < goal.length ; i++){
        if(goal[i] === cards1[0]){
            cards1.shift()
        } else if (goal[i] === cards2[0]){
            cards2.shift()
        } else {
            return "No"
        }
    }
    return "Yes"
}

🗒️코멘트

처음 문제를 읽었을 때, 두 개의 카드를 번갈아 뽑는 다는 조건으로 받아들여져 시작점을 분기로 짝수와 홀수를 적용하여 문제를 풀었지만 알고보니 번갈아 뽑는 것이 아닌 두 개의 카드를 자유롭게 순서에 상관없이 사용하면서 앞에서 부터 차례대로 목적에 맞는 카드를 뽑는 다는 것이다!

2. 신고 결과 받기

문제 설명

신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다.

각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.

  • 신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
  • 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.

k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.

  • 유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.

다음은 전체 유저 목록이 ["muzi", "frodo", "apeach", "neo"]이고, k = 2(즉, 2번 이상 신고당하면 이용 정지)인 경우의 예시입니다.

이용자의 ID가 담긴 문자열 배열 id_list, 각 이용자가 신고한 이용자의 ID 정보가 담긴 문자열 배열 report, 정지 기준이 되는 신고 횟수 k가 매개변수로 주어질 때, 각 유저별로 처리 결과 메일을 받은 횟수를 배열에 담아 return 하도록 solution 함수를 완성해주세요.

에제

코드

function solution(id_list, report, k) {
    const reported = new Map();
    const mail = new Map();
    const reportArr = report.map((el) => el.split(' '))
    
    id_list.forEach((el) => {
        reported.set(el,0);
        mail.set(el,0);
    });
    
    const finalReport = [...new Set(reportArr.map(JSON.stringify))].map(JSON.parse);
    
    finalReport.forEach((el) => reported.set((el[1]),reported.get(el[1])+1));
    
    const bannedId = [...reported.entries()].filter((el) => el[1] >= k).map((el) => el[0]);

    finalReport.forEach((el) => {
        if(bannedId.includes(el[1])){
            mail.set(el[0],mail.get(el[0])+1)
        }
    })
    
    return [...mail.values()];
}

🗒️코멘트

공식문서의 도움을 받았지만 Map과 Set을 자유 자재로 다뤄 볼 수 있는 능력이 길러진 것 같아 기분이 좋았다.

문제를 풀면서 반드시 기억해야 될 점은, Set은 Primitive 값 만 제대로 인식해서 중복을 없앤다는 점이다! 그렇기 때문에 JSON.stringify를 사용하여 Array를 String으로 인식하게 해서 중복을 제거하고 다시 JSON.parse로 Array로 변경해줘서 Set을 다뤄보았다.

profile
🍖먹은 만큼 성장하는 개발자👩‍💻

0개의 댓글