문제
코딩테스트 연습 - 불량 사용자
개발팀 내에서 이벤트 개발을 담당하고 있는 "무지"는 최근 진행된 카카오이모티콘 이벤트에 비정상적인 방법으로 당첨을 시도한 응모자들을 발견하였습니다. 이런 응모자들을 따로 모아 불량
programmers.co.kr
풀이
처음엔 그냥 밴 된 아이디의 경우의 수를 구해서 곱하면 끝날 줄 알았는데
경우의 수가 워낙 들쑥날쑥해서 수학적인 계산으로는 안되겠구나 싶었다
그래서 무식하게 풀기로 했는데 밴 배열의 원소 하나에서 나올 수 있는 아이디를 배열로 가지는 배열..
설명이 너무 긴데 1번 예제를 예시로 들면 아래와 같은 배열이 나온다
[["frodo", "fradi"],[abc123]]
이 배열에서 경우의 수를 구하면 정답을 구할 수 있다
코드
// 폴리필
String.prototype.replaceAll = function(from, to) {
if(from instanceof RegExp)
if(!from.flags.includes)
throw new TypeError("replaceAll must be called with a global RegExp")
else
return this.replace(from, to);
else
return this.replace(new RegExp(from.replace(/[\\^$*+?.():=!|{},\[\]]/g, "\\$&"), "g"), to);
};
function solution(user_id, banned_id) {
var answer = new Set();
const regArr = banned_id.map(v=>[new RegExp(v.replaceAll('*','\\w')),v.length]);
const arr = regArr.map(reg=> user_id.filter(id=> id.search(reg[0])===0 && id.length===reg[1]));
const temp = [];
dfs(0);
console.log(answer)
function dfs(index){
if(temp.length===arr.length){
const sorted = [...temp];
answer.add(sorted.sort().join(''));
return ;
}
for(let j=0; j<arr[index].length;j++){
if(temp.includes(arr[index][j])) continue;
temp.push(arr[index][j]);
dfs(index+1);
temp.pop();
}
}
return answer.size;
}
프로그래머스에서 replaceAll이 구현이 안되어있어서 에러가 나길래 구현하기 귀찮아서 폴리필 코드를 들고와서 붙여넣었다
'Algorithm > 문제' 카테고리의 다른 글
programmers. 길 찾기 게임 (0) | 2021.05.04 |
---|---|
programmers. 합승 택시 요금 (0) | 2021.05.02 |
programmers. 보석 쇼핑 (0) | 2021.04.30 |
programmers. 단속카메라 (0) | 2021.04.26 |
programmers. 섬 연결하기 (0) | 2021.04.26 |