clamp
Clamp
clamp
글쓰기 관리
전체 방문자
오늘
어제
  • 분류 전체보기 (509)
    • IOS (85)
    • SwiftUI+TCA+Combine (9)
    • RxSwift + MVVM (56)
    • Clean Architecture (12)
    • SWIFT (56)
    • iOS - TDD (2)
    • 디자인패턴 (4)
    • CS (56)
      • 알고리즘 (29)
      • 운영체제 (15)
      • 자료구조 (2)
      • 네트워킹 (4)
      • 기타 (6)
    • 회고 (0)
    • Firebase (18)
    • SwiftUI (10)
    • iOS - UIKit (11)
    • iOS - 오픈소스 (6)
    • 코딩테스트 (166)
      • 프로그래머스 (164)
    • 정보처리기사 (14)
    • GitHub (2)
글쓰기 / 관리자

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • ㅅ
  • Swift
  • Q
  • uikit

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
clamp

Clamp

코딩테스트/프로그래머스

프로그래머스 - k진수에서 소수 개수 구하기(소수)

2023. 2. 9. 15:35

k진수에서 소수 개수 구하기

문제 설명

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

  • 0P0처럼 소수 양쪽에 0이 있는 경우
  • P0처럼 소수 오른쪽에만 0이 있고 왼쪽에는 아무것도 없는 경우
  • 0P처럼 소수 왼쪽에만 0이 있고 오른쪽에는 아무것도 없는 경우
  • P처럼 소수 양쪽에 아무것도 없는 경우
  • 단, P는 각 자릿수에 0을 포함하지 않는 소수입니다.
    • 예를 들어, 101은 P가 될 수 없습니다.

예를 들어, 437674을 3진수로 바꾸면 211020101011입니다. 여기서 찾을 수 있는 조건에 맞는 소수는 왼쪽부터 순서대로 211, 2, 11이 있으며, 총 3개입니다. (211, 2, 11을 k진법으로 보았을 때가 아닌, 10진법으로 보았을 때 소수여야 한다는 점에 주의합니다.) 211은 P0 형태에서 찾을 수 있으며, 2는 0P0에서, 11은 0P에서 찾을 수 있습니다.

정수 n과 k가 매개변수로 주어집니다. n을 k진수로 바꿨을 때, 변환된 수 안에서 찾을 수 있는 위 조건에 맞는 소수의 개수를 return 하도록 solution 함수를 완성해 주세요.


제한사항
  • 1 ≤ n ≤ 1,000,000
  • 3 ≤ k ≤ 10

입출력 예nkresult
437674 3 3
110011 10 2

입출력 예 설명

입출력 예 #1

문제 예시와 같습니다.

입출력 예 #2

110011을 10진수로 바꾸면 110011입니다. 여기서 찾을 수 있는 조건에 맞는 소수는 11, 11 2개입니다. 이와 같이, 중복되는 소수를 발견하더라도 모두 따로 세어야 합니다.


풀이 및 소스코드

조건 = 0P0 || P0 || P || 0P

쉽게 말로 하자면

0P0 -> 0 사이에 껴있는 수

P0 -> 오른쪽 끝에있는 0이 아닌 수

P -> 문자에 0이 없는 수

0P -> 오른쪽 끝에 있는 0이아닌 수

 

그냥 0으로 문자를 자르란 소리

주어진 n을 k진법에 맞는 수로 바꾸고 - > var str = String(n, radix: k)

0을 기준으로 자르고 -> str.split(separator: "0")

소수인지 판별하고 (설명은 아래)

func isPrime(_ num: Int) -> Bool{
    if num == 1 { return false }
    if [2,3].contains(num){ return true }
    
    let sq = Int(sqrt(Double(num)))!
    
    for i in 2...sq{
        if num % i == 0{
        return false
        }
    }
    return true
}

소수인 수의 개수를 count한다.

 

import Foundation

func solution(_ n:Int, _ k:Int) -> Int {
    
    //약수의 개수를 구하는 것과 비슷하다.
    //에라스토스테네스의 체를 사용하면 안되는 이유는 높은 진수의 수에서 1345566331같은 수가 나올 수 있다.
    func isPrime(_ num: Int) -> Bool{
        //1, 2, 3의 경우를 설정하고
        if num == 1{
            return false
        }
        if num == 2 || num == 3{
            return true
        }
        //num의 제곱근까지 하는 이유는 17일 경우
        //4*4 16보다 크고 5*5 25보다 작기 떄문에 제곱근이 4.12314213 이런식으로 나오는데
        //제곱근이 4보다 크기 때문에 int형에선 소수의 제곱근을 절대 구할 수 없다.
        for i in 2...Int(sqrt(Double(num))){
            if num % i == 0{
                return false
            }
        }
        return true
    }
    
    var str = String(n, radix: k)
    var count = 0
    print(str)
    
    for num in str.split(separator: "0"){
        print(num)
        if isPrime(Int(num)!) == true{
            count += 1
        }
    }
    
    
    return count
}
저작자표시 비영리 동일조건 (새창열림)
    '코딩테스트/프로그래머스' 카테고리의 다른 글
    • 프로그래머스 - 피로도[Swift](완전탐색)(dfs)
    • 프로그래머스 - [3차] 압축[Swift]
    • 프로그래머스 - 연속 부분 수열 합의 개수[Swift]
    • 프로그래머스 - [1차]뉴스 클러스터링[Swift](다중집합)
    clamp
    clamp
    주니어 iOS개발자의 발악!!!!!!!

    티스토리툴바