happyso
study with happyso
happyso
전체 방문자
오늘
어제
  • 분류 전체보기 (302)
    • GIT (3)
    • 컴퓨터 기본 개념 (29)
    • 알고리즘 (125)
      • 알고리즘 문제 (115)
      • 알고리즘 개념 (10)
    • Go (2)
    • 클라우드 (54)
      • DevOps (4)
      • Kubernetes(쿠버네티스) (33)
      • AWS (6)
      • CKA (8)
    • 리눅스(Linux) (18)
      • 컨테이너(Container) (8)
    • Front (22)
      • JavaScript (2)
      • React (20)
    • Python (21)
      • Python 웹 크롤링 (11)
      • Django (7)
      • MachineLearning (3)
    • 데이터베이스 (6)
      • MariaDB (2)
      • MongoDB (4)
    • C언어 (5)
    • Trouble Shooting (2)
    • 네트워크 (8)
      • CCNA (5)
    • 보안 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 15
  • replace
  • 18
  • Patch
  • apply
  • kubernetes
  • edit

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
happyso

study with happyso

알고리즘/알고리즘 문제

[python] 프로그래머스 > k진수에서 소수 개수 구하기

2023. 6. 6. 14:25

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

나의 풀이 - 시간초과

def is_prime_number(x):
    # 2부터 (x - 1)까지의 모든 수를 확인하며
    if x < 2:
        return False
    for i in range(2, x):
        # x가 해당 수로 나누어떨어진다면
        if x % i == 0:
            return False # 소수가 아님
    return True # 소수임

def solution(n, k):
    answer = 0
    decimal = []
    while n >= k:
        decimal.append(n%k)
        n = n//k
    decimal.append(n)
    decimal.reverse()
    
    for sd in [i for i in ''.join(str(e) for e in decimal).split('0')]:  
        if sd.isdigit() and is_prime_number(int(sd)):
            answer += 1
    return answer

나의풀이 - 시간초과 해결

def is_prime_number(x):
    if x < 2:
        return False
    for i in range(2, int(x**0.5)+1):
        if x % i == 0:
            return False
    return True

def solution(n, k):
    answer = 0
    decimal = []
    while n >= k:
        decimal.append(n%k)
        n = n//k
    decimal.append(n)
    decimal.reverse()
    
    for sd in [i for i in ''.join(str(e) for e in decimal).split('0')]:  
        if sd.isdigit() and is_prime_number(int(sd)):
            answer += 1
    return answer
  • 소수인지 확인하는 함수가 문제였다.
  • 소수인지 확인하기 위해 끝까지 찾을필요 없이 루트를 씌운 만큼만 나누어 떨어지는지 확인하면 됐다.

나의풀이 - 개선

def is_prime_number(x):
    if x < 2:
        return False
    for i in range(2, int(x**0.5)+1):
        if x % i == 0:
            return False
    return True

def solution(n, k):
    answer = 0
    decimal = ""
    while n > 0:
        decimal += str(n%k)
        n = n//k
    for sd in decimal[::-1].split('0'):  
        if sd == "":
            continue
        if is_prime_number(int(sd)):
            answer += 1
    return answer
  • 이진수로 변경하는 로직도 굳이 배열을 사용하지 않고 문자열로 사용하면 더 깔끔했다.
  • 문자열을 거꾸로 뒤집기 위해 [::-1]를 사용하면 유용하다.
저작자표시 비영리 (새창열림)

'알고리즘 > 알고리즘 문제' 카테고리의 다른 글

[python] 프로그래머스 > JadenCase 문자열 만들기  (0) 2023.06.06
[python] 프로그래머스 > 최댓값과 최솟값  (0) 2023.06.06
[python] 프로그래머스 > 두 큐 합 같게 만들기  (0) 2023.06.01
[python] 프로그래머스 > 귤고르기  (0) 2023.05.30
[python] 프로그래머스 > 구명보트  (0) 2023.05.30
    '알고리즘/알고리즘 문제' 카테고리의 다른 글
    • [python] 프로그래머스 > JadenCase 문자열 만들기
    • [python] 프로그래머스 > 최댓값과 최솟값
    • [python] 프로그래머스 > 두 큐 합 같게 만들기
    • [python] 프로그래머스 > 귤고르기
    happyso
    happyso

    티스토리툴바