[COS Pro 1급 Python] 2차 기출문제 3) 경품 당첨자를 구해주세요

정은·2023년 8월 6일

COS Pro 1급

목록 보기
14/26
post-thumbnail

문제 3)

A 사이트에서 아래 조건에 맞는 게시글을 최초로 작성하는 이용자에게 경품을 제공하려 합니다.

  • 현재 작성되어있는 가장 마지막 게시글 이후에 작성된 게시글이어야 합니다.
  • 게시글 번호의 자릿수가 짝수여야 합니다.
  • 게시글 번호가 2n 자릿수 일때, 앞 n 자리의 각 자릿수의 합과 뒤 n 자리의 각 자릿수의 합이 같아야 합니다.

이 사이트의 게시글 번호는 마지막에 작성된 게시글 번호부터 1씩 증가합니다. 예를 들어, 가장 마지막 게시글의 번호가 235386이라면, 이후에 작성되는 게시글의 번호는 235387, 235388 ... 이 되며, 번호가 235387 이상인 게시글이 경품당첨의 대상이 됩니다.

당신은 경품을 받기위해 앞으로 게시글을 몇 개 더 작성해야 하는지 구하려 합니다. 이를 위해 다음과 같이 프로그램 구조를 작성했습니다.

1. 게시글 번호를 1 증가시키고 자릿수를 구합니다.
2. 만약 자릿수가 짝수가 아니라면 1로 돌아갑니다.
3. 만약 구한 자릿수가 짝수라면 다음을 수행합니다.
  3-1. 앞 자릿수 절반과 뒷 자릿수 절반을 분리합니다.
  3-2. 앞 자릿수 절반의 자릿수 합과 뒷 자릿수 절반의 자릿수 합을 구합니다.
  3-3. 위에서 구한 합이 서로 같으면 4로 가고, 같지 않으면 1로 돌아갑니다.
4. (3에서 구한 수 - 처음에 매개변수로 주어진 수)를 return 합니다.

가장 마지막 게시글의 번호 num이 매개변수로 주어질 때, 경품을 받기위해 앞으로 더 작성해야 하는 게시글의 개수를 return 하도록 solution 함수를 작성하려 합니다. 위 구조를 참고하여 코드가 올바르게 동작할 수 있도록 빈칸에 주어진 func_a, func_b, func_c 함수와 매개변수를 알맞게 채워주세요.


매개변수 설명

현재까지 작성된 가장 마지막 게시글의 번호 num이 매개변수로 주어집니다.

  • num은 1 이상 50,000,000 이하의 자연수입니다.

return 값 설명

경품을 받기위해 앞으로 더 작성해야 하는 게시글의 개수를 return 해주세요.


예시
numreturn
110
23538620
예시 설명

예시 #1

가장 마지막에 작성된 게시글의 번호가 1입니다.

당첨조건을 만족하는 게시글 번호는 11이며, 따라서 최소 10번 더 게시글을 작성해야합니다.

예시 #2

가장 마지막에 작성된 게시글의 번호는 6자리이며, 3자리씩 끊으면 다음과 같습니다.

  • 앞 4자리 : 235
  • 뒤 4자리 : 386

앞 3자리의 각 자릿수 합은 다음과 같습니다.

  • 2 + 3 + 5 = 10

뒤 3자리의 각 자릿수 합은 다음과 같습니다.

  • 3 + 8 + 6 = 17

앞으로 최소 20개의 글을 더 작성한다면, 글 번호는 235406이 되며, 뒤 3자리의 각 자릿수 합은 다음과 같습니다.

  • 4 + 0 + 6 = 10

따라서 경품을 받기 위해 최소 20개의 글을 더 작성하면 됩니다.

주어진 문제 3) 코드

def func_a(n):
    ret = 1
    while n > 0:
        ret *= 10
        n -= 1
    return ret

def func_b(n):
    ret = 0
    while n > 0:
        ret += 1
        n //= 10
    return ret

def func_c(n):
    ret = 0
    while n > 0:
        ret += n%10
        n //= 10
    return ret

def solution(num):
    next_num = num
    while True:
        next_num += 1
        length = func_@@@(@@@)
        if length % 2:
            continue
        
        divisor = func_@@@(@@@)  
        front = next_num // divisor
        back = next_num % divisor
        
        front_sum = func_@@@(@@@)
        back_sum = func_@@@(@@@)
        if front_sum == back_sum:
            break
            
    return next_num - num

#아래는 테스트케이스 출력을 해보기 위한 코드입니다.
num1 = 1
ret1 = solution(num1)

#[실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
print("solution 함수의 반환 값은", ret1, "입니다.")

num2 = 235386
ret2 = solution(num2)

#[실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
print("solution 함수의 반환 값은", ret2, "입니다.")

Solution

주어진 문제 3) Solution 코드

def func_a(n):
    ret = 1
    while n > 0:
        ret *= 10
        n -= 1
    return ret

def func_b(n):
    ret = 0
    while n > 0:
        ret += 1
        n //= 10
    return ret

def func_c(n):
    ret = 0
    while n > 0:
        ret += n%10
        n //= 10
    return ret

def solution(num):
    next_num = num
    while True:
        next_num += 1
        length = func_b(next_num)
        if length % 2:
            continue

        divisor = func_a(length // 2)
        front = next_num // divisor
        back = next_num % divisor

        front_sum = func_c(front)
        back_sum = func_c(back)
        if front_sum == back_sum:
            break
            
    return next_num - num

#아래는 테스트케이스 출력을 해보기 위한 코드입니다.
num1 = 1
ret1 = solution(num1)

#[실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
print("solution 함수의 반환 값은", ret1, "입니다.")

num2 = 235386
ret2 = solution(num2)

#[실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
print("solution 함수의 반환 값은", ret2, "입니다.")
  1. func_a() 함수는 매개변수 n 만큼 10을 제곱하여 return. 예를 들어 매개 변수로 전달받은 값이 3이면 10의 세제곱수인 1000을 리턴
  2. func_b() 함수는 전달받은 n의 자릿수를 return.
  3. func_c() 함수는 전달받은 수의 각 자릿수에 있는 숫자를 합산한 결과를 return.

문제 3) Solution 전체 코드 [본인 작성]

def func_a(n):
    # 1. 자릿수의 개수 구하기 len(변수) 또는 while 사용
    ret = len(str(n))
    return ret

def func_b(n):
    # 2. 앞 자릿수와 뒷 자릿수 분리할 수 있도록 divisor 구하기
    ret = pow(10, n // 2)
    return ret

def func_c(n):
    # 3. 각 자리에 있는 수의 합
    ret = 0
    while n > 0:
        ret += n % 10
        n //= 10
    return ret

def solution(num):
    next_num = num
    while True:
        next_num += 1
        length = func_a(next_num)
        if length % 2 != 0:
            continue

        divisor = func_b(length)
        front = next_num // divisor
        back = next_num % divisor

        front_sum = func_c(front)
        back_sum = func_c(back)

        if front_sum == back_sum:
            break

    return next_num - num

#아래는 테스트케이스 출력을 해보기 위한 코드입니다.
num1 = 1
ret1 = solution(num1)

#[실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
print("solution 함수의 반환 값은", ret1, "입니다.")

num2 = 235386
ret2 = solution(num2)

#[실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
print("solution 함수의 반환 값은", ret2, "입니다.")
profile
정니의 이런거 저런거 기록 일지 😛

0개의 댓글