[프로그래머스 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 = 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 😎
👩🏻💻개인 공부 기록용 블로그입니다
오류나 틀린 부분이 있을 경우 댓글 혹은 메일로 따끔하게 지적해주시면 감사하겠습니다.
댓글남기기