[Programmers/Lv. 0] 코딩테스트 입문 Day 11 - 수학, 반복문 (Python)

2023. 5. 27. 16:49Algorithm

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