Early Riser
생각정리
Early Riser
전체 방문자
오늘
어제
  • 분류 전체보기 (128)
    • JS (19)
    • React (33)
    • React Native (2)
    • Library, Tool (13)
    • CSS (2)
    • Algorithm (40)
    • Computer Science (3)
    • 회고 (3)
    • AI (13)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 글쓰기

공지사항

인기 글

태그

  • 오늘의불경
  • 구현
  • 백트래킹
  • useEffect
  • global minima
  • boosting
  • javascript
  • 손실함수
  • 백준
  • 부스트캠프 합격 후기
  • 알고리즘
  • 밑바닥
  • useState
  • 논문리뷰
  • 프로그래머스
  • 부스트캠프 9기
  • lightgbm
  • 딥러닝
  • BFS
  • RNN
  • 완전탐색
  • js
  • 파이썬
  • LGBM
  • dfs
  • 비동기
  • 부스트캠프 합격
  • local minima
  • 자바스크립트
  • react

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Early Riser

생각정리

Algorithm

프로그래머스: 불량 사용자(JS, backtracking) feat. 현대캐피탈 2024 상반기 공개채용

2024. 5. 23. 20:46

알고리즘을 하도 오랜만에 풀었더니 백트래킹이라는 알고리즘을 까먹었어서 되새길겸 쓰는 글이다.

문제는 간단하다. 불량 사용자 배열의 원소들이 각각 가능한 경우의 수를 구하고 이 중 중복이 존재할 수 있고, 불량 사용자 배열의 길이 및 사용자 아이디 배열의 길이가 8이하로 매우 작으니 백트래킹을 이용해 가능한 모든 경우의 수를 구하면 된다.

 

백트래킹을 사용하는 이유는 매번 빈 배열을 dfs에 넣어야하기 때문이다. 현대 캐피탈 2024 상반기 공채 3번이 딱 이런 문제였는데 난 그때 백트래킹을 생각을 못해서 재귀함수의 depth가 0일때 재귀함수 안에서 빈 배열을 생성하여 그 배열에 원소를 넣고 재귀함수에 다시 prop으로 넣는 방식으로 풀었었다. 참고로 1번은 구현, 2번은 그래프탐색(BFS사용), 3번은 백트래킹, 4번은 DP였고 3솔이 합격 컷이였다.

 

다시 문제로 돌아와서 백트래킹의 핵심은 재귀를 호출할 조건을 제한하는 것과, 재귀를 통해 만들어진 집합이 순서만 다른 같은 집합일수있으니 정렬후 문자화하여 다시 집합에서 같은지 다른지 구별하는 것이다.

let list = new Set();
function solution(user_id, banned_id) {
    let sets = []
    banned_id.forEach((b,i)=>{
        let cash = new Set()
        user_id.forEach(u=>{
            if(isSame(u,b)){
                cash.add(u)
            }
        })
        sets.push(cash)
    })
    let c = new Set();
    dfs(sets, banned_id.length, 0, c)
    return list.size;
}

function isSame(user, banned){
    if(user.length !== banned.length){
        return false
    }
    else{
        judge = true
        banned.split('').forEach((b,i)=>{
            if(b !== '*' && b !== user[i]){  
                judge = false
            }
        })
        if(judge){
            return true
        }
        else{
            return false
        }

    }
}

function dfs(array, len ,n, cash){
    if(cash.size === len){
        list.add([...cash].sort().toString());
        return
    }
    if(n === len){
        return
    }
    array[n].forEach((v)=>{
        if(!cash.has(v)){
            cash.add(v)
            dfs(array, len, n+1, cash)
            cash.delete(v)
        }
        else{
            return
        }
    })
}

 

 

'Algorithm' 카테고리의 다른 글

프로그래머스: 단속카메라(javascript, greedy)  (0) 2024.03.31
프로그래머스: 숫자 변환하기(javascript, deque, bfs)  (0) 2023.05.09
프로그래머스: 프렌즈 4 블록(javascript, 구현)  (0) 2023.05.04
프로그래머스: 파일명 정렬(javascript, 구현)  (0) 2023.05.03
백준 1987번: 알파벳(javascript, DFS, 백트래킹)  (0) 2023.04.10
    'Algorithm' 카테고리의 다른 글
    • 프로그래머스: 단속카메라(javascript, greedy)
    • 프로그래머스: 숫자 변환하기(javascript, deque, bfs)
    • 프로그래머스: 프렌즈 4 블록(javascript, 구현)
    • 프로그래머스: 파일명 정렬(javascript, 구현)
    Early Riser
    Early Riser
    2년차 프론트엔드 개발자입니다. https://github.com/EarlyRiser42

    티스토리툴바