티스토리 뷰

문제

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

풀이

  • 진행은 2단계로 나뉨 (숫자조합, 소수확인)
  • 숫자를 만드는 방법은 BFS를 이용하던가 DFS를 이용하면 될 것 같다. BFS를 선택한 이유는 DFS의 경우 재귀함수를 많이 중첩이 이루어 지면 코드가 죽어버린다… 적당한 양의 재귀함수량은 추후에 알아 보기로 하고 이번엔 BFS로 선택
  • 소수확인) 3이하는 바로 리턴(0,1 - false, 2,3 - true) / 4 이상은 제곱근까지의 값을 직접 나누고 나눠지면 소수가 아님

전체코드

import Foundation

func solution(_ numbers:String) -> Int {
    var result: Int = 0
    // 우선 숫자 만들기
    let numbers: [Int] = makeNumber(numbers).sorted()
    for number in numbers {
        if check(number) { result += 1}
    }
    return result
}

func check(_ number: Int) -> Bool { // 소수면 true, 아니면 false
    if number < 4 { return number >= 2 ? true : false }
    // 4이상 일때 진행
    for i in 2...Int(sqrt(Double(number))) {
        if number % i == 0 { return false }
    }
    return true
}

func makeNumber(_ numbers: String) -> Set<Int> {
    let inputs: [String] = numbers.map{ String($0) }
    // $0: numbers 중 숫자를 만드는데 사용한 인덱스, $1: 그렇게 만들어진 숫자
    var numArrs: [([Int], String)] = numbers.enumerated().map{ ([$0.offset],String($0.element))}
    var madeNumSet: Set<Int> = []
    var idx: Int = 0 // numArrs에 접근하는 idx
    while idx < numArrs.count{
        let usedIdx: [Int] = numArrs[idx].0 // 이전에 사용한 numbers의 인덱스
        let num: String = numArrs[idx].1 // 그렇게 만들어진 숫자
        
        for i in 0..<numbers.count { // 새로운 숫자를 생성
            if usedIdx.contains(i) { // 이전에 사용한 숫자는 패스
                continue
            }
            numArrs.append((usedIdx + [i], num+inputs[i]))
        }
        idx += 1
    }
    for numArr in numArrs {
        if let num = Int(numArr.1) {
            madeNumSet.insert(num)
        }
    }
    return madeNumSet
}
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함