[프로그래머스 Python] 코딩테스트 입문 Day 11 - 수학, 반복문
코딩테스트 입문 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 = 6for 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 = 720for i in range(1, 11)=> 11 = 1, 12 = 2, 23 = 6, 64 = 24, 245=120, 1206=720- 다음 결과로부터 n(720) == num(720) 조건문을 만족하여 6(i)가 반환된다.
 
n = 8for i in range(1, 11)=> 11 = 1, 12 = 2, 23 = 6, 64 = 24- 다음 반복문의 결과로 n(8) < num(24) 조건문에 해당하여 4(i)-1 == 3을 반환한다.
 
 - EASY 😎
 
👩🏻💻개인 공부 기록용 블로그입니다
오류나 틀린 부분이 있을 경우 댓글 혹은 메일로 따끔하게 지적해주시면 감사하겠습니다.
댓글남기기