[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

💻 CS/알고리즘 연습

[알고리즘 연습] 불량 사용자 (프로그래머스 lv3, 스위프트)

inu 2022. 5. 5. 00:48
반응형

문제

https://programmers.co.kr/learn/courses/30/lessons/64064

 

코딩테스트 연습 - 불량 사용자

개발팀 내에서 이벤트 개발을 담당하고 있는 "무지"는 최근 진행된 카카오이모티콘 이벤트에 비정상적인 방법으로 당첨을 시도한 응모자들을 발견하였습니다. 이런 응모자들을 따로 모아 불량

programmers.co.kr

풀이

import Foundation

func solution(_ user_id:[String], _ banned_id:[String]) -> Int {
    var bannedList = [[String]]()

    // 각 banned id 별로 후보군 생성
    for bid in banned_id {
        var temp = [String]()
        var bidarr = Array(bid).map { String($0) }

        for uid in user_id {
            var uidarr = Array(uid).map { String($0) }

            if bid.count != uid.count { continue } 
            var possible = true
            for i in 0..<bid.count {
                if bidarr[i] == "*" { continue }
                if bidarr[i] != uidarr[i] {
                    possible.toggle()
                    break
                }
            }
            if possible { temp.append(uid) }
        }
        bannedList.append(temp)
    }

    // dfs로 가능한 케이스 탐색
    // queue를 구현해서 bfs로 구현해도됨    
    var stack = [(idx: Int, idList: [String])]()
    var answer = [[String]]()

    // 먼저 첫번째 banned id 후보들을 stack에 넣어줌
    for id in bannedList[0] {
        stack.append((0, [id]))
    }

    while stack.count > 0 {
        let now = stack.removeLast()

        // 만약 현재의 idx가 마지막이라면 answer에 해당값을 넣어줌
        if now.idx == banned_id.count-1 {
            answer.append(now.idList)
            continue
        }

        let idx = now.idx + 1

        // 다음 idx에서 가능한 것을 추가해서 stack에 추가
        for id in bannedList[idx] {
            var idList = now.idList
            if idList.contains(id) { continue } // 이미 포함시켜준값이라면 skip
            idList.append(id)
            stack.append((idx, idList))
        }
    }

    // 최종값은 중복이 없어야하며 순서를 고려하지 않아야함
    // 중복을 없애기 위해 Set를, 순서를 고려하지 않기 위해 모두 sort처리
    return Set(answer.map { $0.sorted() }).count
}
  • dfs/bfs 문제라는 것을 파악하기 어려웠다. 예전에 파이썬으로 풀었을 때는 product를 사용했는데 dfs/bfs를 사용하는 것이 더 직관적인 것 같다.
  • 여러 경우의 수를 탐색하는 경우라면 dfs/bfs를 한번쯤 고려해보자.
반응형