2023. 5. 27. 16:49ㆍAlgorithm
1. 주사위의 개수
(문제 설명, 제한사항, 입출력 예)
가로, 세로, 높이가 순서대로 주어지는 배열 box와 정육면체 주사위의 모서리 길이 n이 매개변수로 주어졌을 때,
직육면체 box 안에 정육면체 주사위를 최대한 많이 채울 수 있는 개수를 반환하라는 문제이다.
(내가 생각한 풀이 과정)
결국은 n에 따라서 box 안에 들어갈 수 있는 개수가 갈리는 문제라고 생각했다.
어차피 주사위는 "정육면체"라고 문제 조건 안에 주어졌기 때문에 박스의 가로, 세로, 높이 각각 별로 나누어 떨어지는 수를 구해 모두 곱해주면 그것이 주사위가 들어갈 수 있는 수가 된다.
나누어 떨어지는 수는 파이썬의 "//" 연산을 이용하면 된다고 생각했다.
(코드)
💡 내 코드
def solution(box, n):
return (box[0]//n)*(box[1]//n)*(box[2]//n)
2. 합성수 찾기
(문제 설명, 제한사항, 입출력 예)
자연수 n이 주어질 때, n 이하의 합성수 개수를 반환하라는 문제이다.
참고로, 합성수란 약수의 개수가 세 개 이상인 수를 의미한다. (= 소수의 반대말)
(내가 생각한 풀이 과정)
각 수마다 1부터 나누기 연산을 돌리는 방법을 정했다.
반복문 내에는 count라는 변수를 두어 해당하는 수가 나누어 떨어지는 수가 생길 경우 1씩 증가하도록 만들었으며, 이 count의 수가 3이 이상이 되면 바로 합성수로 판단하면 되겠다.
(코드)
💡 내 코드
def solution(n):
answer = 0
for i in range(2, n+1):
count = 0
for j in range(1, i+1):
if i % j == 0: count += 1
if count >= 3: answer += 1
return answer
💡 다른 사람의 풀이 코드
두개의 반복문이 포함되는 조금은 비효율적인 코드에서 불필요한 카운트를 제거한 코드이다.
첫 번째, 큰 반복문의 시작범위는 (어차피) 소수에 포함되는 1, 2, 3을 제외하고 4부터 시작하게 된다.
두 번째, 작은 반복문의 두 번째 매개변수 (end)는 반복 범위를 줄이기 위해 가운데 약수를 기준으로 대칭을 이루는 점을 이용한 코드이다. +1은 제곱수의 예외를 처리하기 위해 추가한 코드이다.
이렇게만 하더라도 위의 코드보다는 상당히 불필요한 반복문이 줄어들기 때문에 효율적이라고 말할 수 있다.
def solution(n):
output = 0
for i in range(4, n + 1):
for j in range(2, int(i ** 0.5) + 1):
if i % j == 0:
output += 1
break
return output
3. 최댓값 만들기 (1)
(문제 설명, 제한사항, 입출력 예)
정수 배열이 주어질 때, 배열 안에 있는 원소 중 두 개를 곱해 만들 수 있는 최댓값을 반환하라는 문제이다.
(내가 생각한 풀이 과정)
배열을 정렬하고, 가장 뒤에 있는 수 두 개를 곱하면 그 수가 최댓값이다.
(코드)
💡 내 코드
def solution(numbers):
numbers.sort()
return numbers[-1] * numbers[-2]
4. 팩토리얼
(문제 설명, 제한사항, 입출력 예)
정수가 주어질 때, i! <= n 조건을 만족하는 가장 큰 정수 i를 반환하라는 문제이다.
i!(팩토리얼)은 1부터 i까지의 정수 곱을 의미한다.
(내가 생각한 풀이 과정)
조건을 적극 활용했다.
n은 최대 3,628,800 (10 팩토리얼 값)이라고 제시되어 있기 때문에,
10부터 1까지 순서대로 값을 나누고 비교 (//=)하며, 맞는 값을 찾으면 어렵지 않게 구할 수 있었다.
(코드)
💡 내 코드
def solution(n):
fac = 3628800
for i in range(10, 0, -1):
if fac > n: fac //= i
else: return i