본문 바로가기
Python/알고리즘

[COS PRO 1급 #3-7] 카프리카 수

by 포푸리 (POPOOLY) 2023. 2. 25.
반응형

문제설명

카프리카 수는 다음을 만족하는 수를 뜻합니다.

* 자신의 제곱수를 둘로 나누어 더한 값이 자기 자신과 같습니다.
* 단, 둘로 나뉜 수는 모두 양수여야 합니다.

예를 들어, 55^2 는 3,025입니다. 3,025는 3과 025, 30과 25, 302와 5로 나눌 수 있습니다. 이때 30+25 = 55이므로 55는 카프리카 수입니다.

자연수 k가 매개변수로 주어질 때, k 이하인 모든 카프리카 수를 리스트에 담아 오름차순으로 정렬하여 return 하도록 solution 함수를 작성했습니다. 그러나, 코드 일부분이 잘못되었기 때문에, 코드가 올바르게 동작하지 않습니다. 주어진 코드에서 _**한 줄**_만 변경해 모든 입력에 대해 올바르게 동작하도록 수정해주세요.

매개변수 설명

자연수 k가 solution 함수의 매개변수로 주어집니다.
* k는 50 이상 100,000 이하인 자연수입니다.

return 값 설명

k 이하인 모든 카프리카 수를 리스트에 담아 오름차순으로 정렬하여 return 해주세요.

* 100,000 이하인 카프리카 수는 100개보다 작습니다.

예시

| k   | return               |
|-----|----------------------|
| 500 | [9, 45, 55, 99, 297] |

예시 설명

9 x 9 = 81 → 8 + 1 = 9
45 x 45 = 2,025 → 20 + 25 = 45
55 x 55 =  3,025 → 30 + 25 = 55
99 x 99 = 9,801 → 98 + 01 = 99
297 x 297 = 88,209 → 88 + 209 = 297

문제 코드

def solution(k):
    answer = []
    for i in range(1, k + 1):
        square_num = i * i
        divisor = 1
        while square_num % divisor != 0:
            front = square_num // divisor
            back = square_num % divisor
            divisor *= 10
            if back != 0 and front != 0:
                if front + back == i:
                    answer.append(i)
    return answer

풀이

def solution(k):
    answer = []
    for i in range(1, k + 1):
        square_num = i * i
        divisor = 1
        
        # divisor는 10의 제곱수로 square_num을 divisor로 나눈 몫, 나머지가 자신의 제곱수를 둘로 나눈 값
        # divisor가 square_num보다 크면 안되며, 크게되면 square_num을 divisor로 나눈 나머지가 square_num임
        while square_num % divisor != square_num:
            front = square_num // divisor
            back = square_num % divisor
            divisor *= 10
            if back != 0 and front != 0:
                if front + back == i:
                    answer.append(i)
    return answer

 

댓글