▷ 코드카타

[내일배움캠프 _ QA/QC 5기] 27일차 _ 코드카타 33~34문항

qc-standard 2026. 4. 14. 17:10

⊙ 코드카타

33) 문제 : 두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.

제한 사항 : 1 ≤ left ≤ right 1,000 

생각 과정 :

● 범위 정하기 → 약수 개수 세기 → 약수 찾기 → 판별 합산
def solution(left, right):
    answer = 0
 
    for num in range(left, right + 1):
        count = 0
       
        for i in range(1, num + 1):
            if num % i == 0:
                count += 1
       
        if count % 2 == 0:
            answer += num
        else:
            answer -= num
           
    return answer
● range 사용 시 (시작, 끝+1)을 하는 이유는 끝은 마지노선의 역할로 끝 숫자가 나열되지 않는다,,, 그래서 +1을 하여 끝 숫자까지 나열되도록 하는 것

  #정리
    answer 개수를 셀 수 있는 빈 바구니 생성
→ for문 이용 || num이라는 변수에 range를 이용해 left ~ right까지 나열
→ count란 빈 바구니에 num 변수를 담는다
→ for문 이용 || i라는 변수에 range를 이용 1 ~ num까지 나열
→ 만약 num 나누기 i 했을 때, 나머지가 0이면
→ count 바구니에 누적해서 +1 : 카운트를 세며 약수를 찾는 과정 시행
→ 이때, answer 바구니에 num의 누적합계를
→ num / i 나머지가 0이 아닌 경우
→ answer 바구니에 num의 누적 빼기를
→ answer 바구니를 return하라
len : 줄자 : 개수,길이를 세어 숫자로 뱉어내줘
range : 번호표 발행 : 0 ~ n번까지 나열해서 순서대로 뱉어내줘

Tip 약수의 개수홀수인 숫자는 제곱수
def solution(left, right):
    answer = 0
    for num in range(left, right + 1):
 
        if int(num ** 0.5) ** 2 == num:
            answer -= num
        else:
            answer += num
    return answer
● ex) 9의 약수 : 1,3,9 - 3개 - 홀수
● ex) 16의 약수 : 1,2,4,8,16 - 5개 - 홀수
● 제곱근은 짝이 없기 때문 : 둘이 곱해서 쌍으로 존재
    ex : 8 - (1,8) (2,4) - 2개 쌍
         : 12 - (1,12) (2,6) (3,4) - 3개 쌍


 # 정리
answer 개수를 셀 수 있는 빈 바구니 생성
→ for문 이용 || num이라는 변수에 range를 이용해 left ~ right까지 나열
숫자의 제곱근이 정수라면? 그것은 제곱수이고 약수가 홀수다!
    = num 변수의 제곱근 소수점 아래를 버리고 정수로 나타냄
    = √num을 정수로 나타내고 ( √num 정수)²
    = △ 정수를 거듭제곱 했을 때 num과 일치하면 
    int() : 소수점 아래 버리고 정수만으로 나타내라
    ** : 거듭제곱 = n승
(√num 정수)² 가 num과 일치하면 num의 누적 빼기를 answer에
→ 그외에는 num의 누적 합을 answer에
→ answer 바구니를 return하라

 

 

 

34) 문제 : 문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수, solution을 완성해주세요.
s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주합니다.

생각 과정 :

● str으로 치환 → for range를 이용해 하나하나 담기게 나열 → a,b,c 역순으로 나열
● 대문자는 소문자보다 작은걸로 어떻게 간주하지?

def solution(s):
    sorted_list = sorted(s, reverse=True)
   
    answer = "".join(sorted_list)
   
    return answer
● 파이썬에서 기본적으로 "대문자 - 소문자" 순서
   → 이를 역순=내림차순 하면 "소문자 - 대문자"가 됨
   → reverse(역순) = True(진실) 내림차순을 하겠다는 뜻

● sorted() VS for range
   - sorted() : 데이터를 쪼개고 순서대로 재배치하여 리스트에 담음
   - for range : 데이터 순서대로 하나식 꺼내서 그대로 담음

● "".join()
    : 문자열 함수
    : ""(빈 문자열)을 기준으로 그 기준을 이어라
    : ex) "-".join(['a', 'b', 'c']) → a-b-c
    : ex) ''".join( ['a', 'b', 'c'] ) → abc
    : 기준("")을 바탕으로 이어 붙여라!! 이런 함수
    : 반드시 기준이 되는 문자열!!

 

 

 

35) 문제 : 새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다. 이 놀이기구의 원래 이용료는 price원 인데, 놀이기구를 N 번 째 이용한다면 원래 이용료의 N배를 받기로 하였습니다. 즉, 처음 이용료가 100이었다면 2번째에는 200, 3번째에는 300으로 요금이 인상됩니다.
놀이기구를 count번 타게 되면 현재 자신이 가지고 있는 금액에서 얼마가 모자라는지를 return 하도록 solution 함수를 완성하세요.
단, 금액이 부족하지 않으면 0을 return 하세요.

제한 사항

: 놀이기구의 이용료 price : 1   price 2,500, 는 자연수
:
처음 가지고 있던 금액 : 1 money   1,000,000,000, money는 자연수
:
놀이기구의 이용 횟수 : 1 count 2,500, count는 자연수

생각 과정 :

● 반복문 - for을 이용해 n번 탄거 만큼 누적 합을 구하고 answer에서 count번 탄 금 - price해서 return하면 되지 않을까?

def solution(price, money, count):
    total_price = 0
   
    for i in range(1, count + 1):
        total_price += (price * i)
       
    shortage = total_price - money
   
    if shortage <= 0:
        return 0
    else:
        return shortage
    # 정리
→ total_price라는 빈 바구니 생성

for문 이용 || i 변수에 range 이용 1 ~ count까지 나열
    = i는 n번 탄 횟수를 나타내는 변수가 됨
total_price라는 빈 바구니에 총 이용료를 누적 합계 함
     총 이용료= price(가격) × i(n번 탄 횟수)
     = 누적 합을 해야 지불해야할 요금을 알 수 있음(= 총 이용료)
    = i 변수만 total_price에 담으면 단순히 n번 탄 횟수만 담기게 됨

→ shortage(부족)는 총 이용료 - 내가 가진 돈

→ 만약 shortage(부족)가 0 또는 -일 경우 :
    = 내가 가진 돈이 더 많음
→ 0을 return

→ 그외 경우
    = 내가 가진 돈이 적음
→ shortage(부족)를 return