본문 바로가기
알고리즘

[Swift 알고리즘] 프로그래머스 lv2 - k진수에서 소수 갯수 구하기

by 코코종 2022. 3. 16.
728x90

안녕하세요 코코종입니당!

이번에도 작년 문제인데 그때는 너어어무 어렵게 생각했던 문제인데... 그때는 무슨 조건이 4개나 있어 😵‍💫😵‍💫하면서 어려워했는데 다시 찬찬히 보니까 쉽더라구요! (근데 왜 프로그래머스에서 이 문제의 점수를 많이 주는지는 모르겠습니다 주차요금이 1점 주더만... 얘는 8점이나?)

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

 

코딩테스트 연습 - k진수에서 소수 개수 구하기

문제 설명 양의 정수 n이 주어집니다. 이 숫자를 k진수로 바꿨을 때, 변환된 수 안에 아래 조건에 맞는 소수(Prime number)가 몇 개인지 알아보려 합니다. 0P0처럼 소수 양쪽에 0이 있는 경우 P0처럼 소

programmers.co.kr

import Foundation

func isPrimeNum(_ n: Int) -> Bool {
    if n == 2 || n == 3{
        return true
    } else if (n != 2 && n%2 == 0) || n == 1 {
        return false
    } else {
        let sqrtInt = Int(sqrt(Double(n)))
        
        for i in 3...sqrtInt {
            if n%i == 0 {
                return false
            }
        }
        return true
    }
    
}

func solution(_ n:Int, _ k:Int) -> Int {
    
    // case1 0P0
    // case2 P0
    // case3 0P
    // case4 P
    
    let converted: String = String(n, radix: k)
    
    let splited = converted.components(separatedBy: "0")
    
    var result = 0
    
    splited.forEach {
        // ""은 0으로 처리
        let num = Int($0) ?? 0
        if isPrimeNum(num) {
            result += 1
        }
    }
    
    return result
}

 


 

간단하게 설명하자면 k진수로 변환 후 0을 기준으로 쪼갠 배열을 돌면서 소수인지 판단하면 되는 문제였습니다! 간단하쥬?(그러니까 왜 8점이냐고 억울하게)

그런데 입출력 예시를 보면 00이 들어가있는 경우 components로는 ""이 나올수 있더라구요! 그래서 optional에 대한 처리를 0으로 해줬습니다(0은 소수가 아니니까~)

 

생각보다 `String(n, radix: k)`를 몰라서 하나하나 해결하신분들이 많더라구여! 저도 스위프트에 없을거라고 생각하긴 했지만 혹시 몰라서 검색을 해봤더니 띠용? 이걸 해주네? 하면서 가져다가 썼습니다! 그래서 다른분들보다 사아아알짝 빨랐습니다.

 

소수인지 판단하는 부분은 워낙 많이해서 다 아실거 같아서 설명은 패스하겠습니다(귀찮은거 아님^^...) 단, 제곱근까지 나누는게 아니라 n-1까지 나눠보는것으로 하면 1번 문제에서 시간초과가 나더라구요 그래서 바로 제곱근으로 처리해줬습니다.

 

여담으로 과제형 코딩테스트를 진행중인데 겹쳐서 새벽에 졸린눈을 비비며 풀었는데 생각보다 쉬워서 일찍(2am)에 잤습니당!!

그럼 저는 이만~~~!!

728x90