ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Baekjoon] 약수와 소수와 배수
    알고리즘/코딩테스트 문제 정리 2025. 2. 27. 15:01
    단계별 풀이 중 9단계인 약수, 소수, 배수에 대한 알고리즘 풀이 과정에서 느낀 점 및 내 풀이 결과를 나타내었다.

     

    해당문제: https://www.acmicpc.net/step/10


    🌈 파이썬 코드

    📦 5086 1번 문제

    문제 풀기 전 내 생각

    일단 입력부분에서 0 0이 오면 반복문을 종료하는 구문을 짜야겠고만. break와 같은 탈출문구? 를 넣으면 될 듯 factor인지 multiple인지 neither인지를 출력하는 함수를 만드는 게 목표

    def solution():
        # 연산의 횟수가 정확히 정해지지 않았으므로 while
        while True:
            a, b = map(int, input().split())
            # 탈출 구문
            if a + b == 0:
                break
            # 둘 중에 큰 수, 작은 수를 먼저 구해야한다.
            maxValue = max(a, b)
            minValue = min(a, b)
            # 이후 큰수로 작은 수를 나머지연산을 했을 때 나머지가 없다면 둘은 neither관계가 아니다.
            if not (maxValue % minValue == 0):
                print('neither')
                continue;
            print('factor' if maxValue == b else 'multiple')
    solution()

     

    📦 2501 2번 문제

    # 약수 구하기 브론즈 3
    
    def solution():
        a, b = map(int, input().split())
        list1 = [1, ]
        for i in range(2, a + 1):
            if a % i == 0:
                list1.append(i)
        return list1[b - 1] if len(list1) >= b else 0
    print(solution())
    • 약수 구하는 문제에서 소수와 헷갈려서 수학용어에 대해서 좀 구분을 잘 해야할 것 같다.

     

     

    📦 9506 3번 문제

    풀기 전 내 생각

    완전수 = 자신을 제외한 모든 약수들의 합 == 자신 

    완전수인지 아닌지 구하여라
    완전수가 아니라면 "n is NOT perfect." 출력 완전수라면 약수들의 합으로 나타내어 출력(6 = 1 + 2 + 3)

    # 약수들의 합 브론즈 1
    
    def solution():
        while True:    
            N = input()
            if N == '-1':
                break
            result = f'{N} = 1'
            약수들 = [1, ]
            for i in range(2, int(N)):
                if int(N) % i == 0:
                    약수들.append(i)
                    result += f' + {str(i)}'
            print(f"{N} is NOT perfect." if sum(약수들) != int(N) else result)    
    solution()
    
    # 문자열을 추가하는 방식을 좀 더 쉽게 나타낼 순 없을까? >>개선 후
    def solution():
        while True:    
            N = int(input())
            if N == -1:
                break
            result = f'{N} = 1'
            약수들 = [1, ]
            for i in range(2, N):
                if N % i == 0:
                    약수들.append(i)
            print(f"{N} is NOT perfect." if sum(약수들) != N else f"{N} = " + " + ".join(map(str, 약수들)))    
    solution()
    # 문자열을 추가하는 방식을 좀 더 가독성 있게 나타내었다.
    • 문자열 추가하는 방식에 대해서 나중에도 참고하며 사용할 수 있을 듯하다.

     

    📦 9506 4번 문제

    # 소수 찾기
    
    import math
    def solution():
        N = int(input())
        values = list(map(int, input().split()))
        count = N
        for value in values:
            if value == 1:
                count -= 1
                continue
            for i in range(2, int(math.sqrt(value)) + 1):
                if value % i == 0:
                    count -= 1
                    break
        return count
    print(solution())
    
    # 또 다른 풀이
    def is_prime(num):
        if num <= 1:
            return False
        i = 2
        while i ** 2 <= num:
            if num % i == 0:
                return False
            i += 1
        return True
    • 제곱근 표현 방식이 **0.5도 있는데 이것도 나름 괜찮은 것 같다
    • 끝 범위를 제곱근으로 표현할수도 있지만 i의 값을 제곱으로 해서 계산해도 된다

     

    📦 2581 5번 문제

    # 소수 브론즈 2
    import sys
    
    def is_prime(num):
        if num <= 1:
            return False
        i = 2
        while i ** 2 <= num:
            if num % i == 0:
                return False
            i += 1
        return True
    
    def solution():
        lines = sys.stdin.readline().rstrip()
        N = int(input())
        M = int(input())
        array1 = [i for i in range(N, M + 1) if is_prime(i)]
        if len(array1) > 0:
            print(sum(array1))
            print(array1[0])
        else: print(-1)
    solution()

     

    📦 11653 6번 문제

    # 소인수분해 브론즈 1
    
    # 개선 전
    def solution():
        N = int(input())
        i = 2
        while N > 1:
            if N % i == 0:
                N = ( N // i)
                print(i)
                i = 2
            else:
                i += 1        
    solution(
    
    # 개선 후
    def solution():
        N = int(input())
        i = 2
        while i ** 2 <= N:
            if N % i == 0:
                N //= i
                print(i)
                i = 2
                continue
            i += 1
        if N > 1:
            print(N)        
    solution()
    • 개선 전의 풀이는 시간이 상당히 소요되는 반면 개선 후에는 연산의 횟수를 많이 줄여서 시간이 많이 줄었다(600ms => 40ms)

    '알고리즘 > 코딩테스트 문제 정리' 카테고리의 다른 글

    [Baekjoon] 단계별 문제 - 2차원 배열  (0) 2025.02.25
    [백준] 이분탐색 실버  (0) 2025.02.11
    [99클럽] 왜지...?  (1) 2025.02.04
    [99클럽] stack 구현  (0) 2025.02.03
    [99클럽] 이분탐색 활용  (0) 2025.01.22

    댓글

Designed by Tistory.