728x90

🔗 Problem Link

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


❔Thinking

  • begin, end가 주어질 때, 해당 구간에 놓이는 숫자 블록을 반환한다.
  • 숫자 블록은 n*2, n*3, n*4 순서로 놓인다
    • n = 1인 경우, [0,1,1,1,1,1,1,1,1]
    • n = 2인 경우, [0,1,1,1,2,1,2,2,1]
    • n = 3인 경우, [0,1,1,1,2,1,3,2,1]
  • 1 <= begin <= end <= 1,000,000,000
  • 블록에 적힌 숫자 <= 10,000,000

💻Solution

from bisect import bisect_left

def find_divisors(n)->list:
    divisor_list = []
    for i in range(1, int(n**0.5)+1):
        if n % i == 0:
            divisor_list.append(i)
            if i**2 != n:
                divisor_list.append((n // i))
    divisor_list.sort(reverse=True)
    return divisor_list

def solution(begin, end):
    answer = []
    for num in range(begin, end+1):
        if num == 1:
            answer.append(0)
            continue
        div_list = find_divisors(num)
        for i in div_list:
            if i * 2 <= num and i <= 10**7:
                answer.append(i)
                break
    return answer

🗝️keypoint

  1. 해당 위치에 놓이는 숫자블록은, 해당 위치보다 작은 가장 큰 숫자이다. 즉 큰 수부터 확인하여 범위에 해당한다면 탐색을 멈춘다. ( = bisect_left)
  2. 숫자의 범위가 10,000,000이므로, 이 숫자를 넘는 블록은 놓일 수 없다.
  3. 약수의 개수를 구하는 방법은, 제곱수까지만 구하는 방법을 통해 최적화 할 수 있다. (단, 9와 같은 제곱수인 경우 3이 중복되지 않도록 주의한다.)

'코딩테스트 > Python' 카테고리의 다른 글

[Baekjoon] 2294. 동전 2  (0) 2025.02.13
[Programmers] Level 2. 도넛과 막대 그래프  (0) 2025.02.12
[Baekjoon] 2565. 전깃줄  (0) 2025.02.11
[Programmers] Level 2. 충돌위험 찾기  (0) 2025.02.09
[Baekjoon] 2573. 빙산  (0) 2025.02.07

+ Recent posts