코딩테스트 입문 Day 11 수학, 반복문


1. 주사위의 개수

머쓱이는 직육면체 모양의 상자를 하나 가지고 있는데 이 상자에 정육면체 모양의 주사위를 최대한 많이 채우고 싶습니다. 상자의 가로, 세로, 높이가 저장되어있는 배열 box와 주사위 모서리의 길이 정수 n이 매개변수로 주어졌을 때, 상자에 들어갈 수 있는 주사위의 최대 개수를 return 하도록 solution 함수를 완성해주세요.

제한사항

  • box의 길이는 3입니다.
  • box[0] = 상자의 가로 길이
  • box[1] = 상자의 세로 길이
  • box[2] = 상자의 높이 길이
  • 1 ≤ box의 원소 ≤ 100
  • 1 ≤ n ≤ 50
  • n ≤ box의 원소
  • 주사위는 상자와 평행하게 넣습니다.

(1) 코드 작성

def solution(box, n):
    return (box[0]//n) * (box[1]//n) * (box[2]//n)

(2) 코드 리뷰 및 회고

  • 문제는 상자의 가로, 세로, 높이 길이에 맞게 최대로 넣을 수 있는 주사위의 수를 구하는 것이다.
  • 우선 가로 길이만큼 들어갈 수 있는 주사위의 수는 box[0]//n 으로 구했다.
  • 세로와 높이 역시 가로에 맞는 주사위의 수를 구한 것과 동일하게 구하고 총 개수이기 때문에 세 값을 곱했다.
  • EASY 😎


2. 합성수 찾기

약수의 개수가 세 개 이상인 수를 합성수라고 합니다. 자연수 n이 매개변수로 주어질 때 n이하의 합성수의 개수를 return하도록 solution 함수를 완성해주세요.

제한사항

  • 1 ≤ n ≤ 100

(1) 코드 작성

def solution(n):
    """
    합성수는 1과 본인을 제외하고 다른 값으로 나눠질 수 있는 수를 말한다.
    ex) 2 = 1*2 (소수) / 4 = 1*4, 2*2 (합성수)
    """
    answer = []
    cnt_answer = 0
    # 합성수 구하는 과정
    for num1 in range(2, n+1):
        # 2와 n 사이의 값 중에서 합성수인 것을 고르는 과정 
        for num2 in range(1, num1+1):
            # num1이 num2로 나눠진다 == 합성수
            if num1%num2 == 0:
                answer.append(num1)
        if answer.count(num1) > 2:
            cnt_answer += 1  
    return cnt_answer

(2) 코드 리뷰 및 회고

  • 합성수를 판단할 수 있는 방법은 1과 본인을 제외하고 그 사이의 값으로 나눠지는 경우가 있는지를 구하는 것이다.
  • 위 코드와 같이 for 중첩문을 사용해 2부터 자기 자신 값까지 반복하도록 했고, 해당 숫자가 num2로 나눠떨어지는 경우를 합성수로 판단하여 answer 리스트에 넣었다.
  • 1과 본인으로 나눠떨어지는 경우는 합성수로 판단할 수 없기 때문에 count로 2개를 넘는 경우만 합성수로 판단

  • 예시 적용
    • n = 6
    • for num1 in range(2, 7)
      • num1 == [2, 3, 4, 5, 6]
    • num1 = 2일 때, for num2 in range(1, 3)
      • num2 == [1, 2]
    • 1: 2%1 == 0, 2: 2%2 == 0 => answer 리스트에 2가 두번 들어감
      • answer에 들어간 2는 총 2개 == 2를 넘지 않음 == 합성수 X
    • num1 = 4일 때, for num2 in range(1, 5)
      • num2 == [1, 2, 3, 4]
    • 1: 4%1 == 0, 2: 4%2 == 0, 3: 4%3 != 0, 4: 4%4 == 0
      • answer에 들어간 4는 총 3개 == 2를 넘음 == 합성수 O
    • 총 합성수 개수 = 1개 (4)
  • EASY 😎


3. 최댓값 만들기(1)

정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return하도록 solution 함수를 완성해주세요.

제한사항

  • 0 ≤ numbers의 원소 ≤ 10,000
  • 2 ≤ numbers의 길이 ≤ 100

(1) 코드 작성

def solution(numbers):
    num_list = sorted(numbers, reverse=True)
    return num_list[0]*num_list[1]

(2) 코드 리뷰 및 회고

  • numbers로 입력되는 리스트의 요소들 중 두 개를 곱해 만들 수 있는 조합을 구하는 문제
  • 두 수의 곱을 크게 만들기 위해선 두 수를 가장 큰 값과 그 다음으로 큰 값으로 사용하면 된다.
  • 즉 list를 sorted 함수를 이용해 내림차순 정렬을 하고 0번째 인덱스 값과 1번째 인덱스 값을 곱한 결과를 반환하도록 설정했다.
  • EASY 😎


4. 팩토리얼

i팩토리얼 (i!)은 1부터 i까지 정수의 곱을 의미합니다. 예를들어 5! = 5 * 4 * 3 * 2 * 1 = 120 입니다. 정수 n이 주어질 때 다음 조건을 만족하는 가장 큰 정수 i를 return 하도록 solution 함수를 완성해주세요.

  • i! ≤ n

제한사항

  • 0 < n ≤ 3,628,800

(1) 코드 작성

def solution(n):
    num = 1
    for i in range(1, 11):
        num *= i
        if num > n:
            return i-1
        elif num == n:
            return i

(2) 코드 리뷰 및 회고

  • 입력되는 n은 팩토리얼 결과값이다. 즉 5! 의 결과인 120이 n으로 주어지는 것이다.
  • 팩토리얼 계산 과정을 참고하여 1부터 11까지로 범위를 설정하여 반복문을 작성한다.
    • 1 ~ 11로 설정하여 1부터 10까지 총 10회 반복될 수 있도록 설정한 이유는 제한 사항 참고 시, 결과값으로 출력될 수 있는 최댓값이 10이기 때문이다.
  • num을 1로 설정 후, 1~10 사이의 값을 곱한 결과가 n인 경우 그 때의 i 값을 반환한다.
  • 또는 팩토리얼로 딱 계산되는 값이 아닌 경우가 올 수 있기 때문에 num이 입력된 n을 넘어서는 경우 i-1 값을 반환한다.

  • 예시 적용
    • n = 720
      • for i in range(1, 11) => 11 = 1, 12 = 2, 23 = 6, 64 = 24, 245=120, 1206=720
      • 다음 결과로부터 n(720) == num(720) 조건문을 만족하여 6(i)가 반환된다.
    • n = 8
      • for i in range(1, 11) => 11 = 1, 12 = 2, 23 = 6, 64 = 24
      • 다음 반복문의 결과로 n(8) < num(24) 조건문에 해당하여 4(i)-1 == 3을 반환한다.
  • EASY 😎


👩🏻‍💻개인 공부 기록용 블로그입니다
오류나 틀린 부분이 있을 경우 댓글 혹은 메일로 따끔하게 지적해주시면 감사하겠습니다.

댓글남기기