Hi, There!
안녕하세요, 바오밥입니다.
목차
- 문제
- 풀이
문제
문제 내용
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 해주세요.
예시
예시 설명
예시 #1
- 가장 마지막에 작성된 게시글의 번호가 1입니다.
- 당첨조건을 만족하는 게시글 번호는 11이며, 따라서 최소 10번 더 게시글을 작성해야합니다.
예시 #2
- 가장 마지막에 작성된 게시글의 번호는 6자리이며, 3자리씩 끊으면 다음과 같습니다.
- 앞 3자리 : 235, 뒤 3자리 : 386
- 앞 3자리의 각 자릿수 합은 다음과 같습니다 : 2 + 3 + 5 = 10
- 뒤 3자리의 각 자릿수 합은 다음과 같습니다 : 3 + 8 + 6 = 17
앞으로 최소 20개의 글을 더 작성한다면, 글 번호는 235406이 되며, 뒤 3자리의 각 자릿수 합은 다음과 같습니다.
4 + 0 + 6 = 10
따라서 경품을 받기 위해 최소 20개의 글을 더 작성하면 됩니다.
풀이
풀이 코드 및 해설
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 # 1. 게시글 번호 1 증가
length = func_b(next_num) # 게시글 번호의 자릿수를 반환
if length % 2: # 2. 게시글 번호의 자릿수가 짝수라면, 예시) 1은 홀수, 10은 짝수
continue # 3. 자릿수가 짝수인 경우에만 아래의 과정을 진행
divisor = func_a(length//2) # 3-1. 10^자릿수//2 를 반환하여 나누는 값으로 사용
front = next_num // divisor # 앞 자릿수를 분리하여 front로 저장
back = next_num % divisor # 뒷 자릿수를 분리하여 back으로 저장
front_sum = func_c(front) # 앞 자릿수의 합 구하기
back_sum = func_c(back) # 뒷 자릿수의 합 구하기
if front_sum == back_sum: # 자릿수가 동일한 경우에만 반복문 종료
break
return next_num - num # 경품 게시글 번호 - 현재 게시물 번호 = 작성해야 할 게시글 수
'Certificate > Cert - Cos Pro 1급' 카테고리의 다른 글
[Cos Pro 1급] 기출문제 2회차, 언제까지 오르막길이야 (0) | 2021.07.14 |
---|---|
[Cos Pro 1급] 기출문제 2회차, 합이 k 배가 되는 수 (0) | 2021.07.14 |
[Cos Pro 1급] 기출문제 2회차, 지하철 기다리기 (0) | 2021.07.14 |
[Cos Pro 1급] 기출문제 2회차, 도서 대여점 운영 (0) | 2021.07.14 |
[Cos Pro 1급] 기출문제 1회차, 주식으로 최대 수익을 내세요 (0) | 2021.07.13 |