본문 바로가기

파이썬(문제풀이)

파이썬 2제곱, 3제곱, 4제곱 코딩

더보기

파이썬에서 2제곱, 3제곱, 4제곱을 구하는 방법은 여러 가지가 있다. 다음은 몇 가지 대표적인 방법들이다.

#1. 거듭제곱 연산자 ** 사용

가장 간단하고 직관적인 방법입니다. ** 연산자는 좌측 피연산자를 우측 피연산자만큼 거듭제곱합니다.

# 2의 2제곱, 3제곱, 4제곱
num = 2
print(f"2의 2제곱: {num**2}")
print(f"2의 3제곱: {num**3}")
print(f"2의 4제곱: {num**4}")

# 출력
# 2의 2제곱: 4
# 2의 3제곱: 8
# 2의 4제곱: 16

코드 분석


#2. pow() 함수 사용

pow(x, y) 함수는 x의 y제곱을 계산합니다. 이 함수는 거듭제곱 연산자와 동일한 기능을 제공하며, 가독성이 더 좋다고 생각하는 사람들도 있습니다.

# 3의 2제곱, 3제곱, 4제곱
num = 3
print(f"3의 2제곱: {pow(num, 2)}")
print(f"3의 3제곱: {pow(num, 3)}")
print(f"3의 4제곱: {pow(num, 4)}")

# 출력
# 3의 2제곱: 9
# 3의 3제곱: 27
# 3의 4제곱: 81

#3. math.pow() 함수 사용

math 모듈의 pow() 함수도 거듭제곱을 계산하는 데 사용됩니다. 이 함수는 부동 소수점(float) 결과를 반환하므로, 정수 연산을 원할 경우 int()로 형 변환해야 할 수 있습니다.

import math

# 4의 2제곱, 3제곱, 4제곱
num = 4
print(f"4의 2제곱: {math.pow(num, 2)}")
print(f"4의 3제곱: {math.pow(num, 3)}")
print(f"4의 4제곱: {math.pow(num, 4)}")

# 출력
# 4의 2제곱: 16.0
# 4의 3제곱: 64.0
# 4의 4제곱: 256.0

#4. 반복문(for 또는 while) 사용

거듭제곱의 수학적 정의를 직접 구현하는 방법입니다. 반복문을 사용하면 곱셈을 여러 번 수행하여 결과를 얻을 수 있습니다. 이는 컴퓨터가 내부적으로 거듭제곱을 계산하는 원리와 유사합니다.

# for 반복문을 사용한 5의 3제곱
base = 5
exponent = 3
result = 1
for _ in range(exponent):
    result *= base
print(f"5의 3제곱: {result}")

# while 반복문을 사용한 6의 2제곱
base = 6
exponent = 2
result = 1
while exponent > 0:
    result *= base
    exponent -= 1
print(f"6의 2제곱: {result}")

For 반복문 코드 분석

첫 번째 부분은 for 반복문을 이용해 5의 3제곱()을 계산합니다.

  • base = 5: 거듭제곱의 밑이 되는 값 5를 base 변수에 할당합니다.
  • exponent = 3: 지수(몇 번 곱할지) 값 3을 exponent 변수에 할당합니다.
  • result = 1: 결과 값을 저장할 변수 result를 1로 초기화합니다. 거듭제곱은 곱셈이므로, 0이 아닌 1부터 시작해야 올바른 결과가 나옵니다.
  • for _ in range(exponent):: exponent 값인 3만큼 반복합니다. _는 반복 횟수만 필요하고 변수 값은 사용하지 않을 때 관례적으로 사용됩니다.
  • result *= base: 반복할 때마다 result 변수에 base 값을 곱합니다.
    • 1번째 반복: result는 1 * 5로 5가 됩니다.
    • 2번째 반복: result는 5 * 5로 25가 됩니다.
    • 3번째 반복: result는 25 * 5로 125가 됩니다.
  • print(f"5의 3제곱: {result}"): 최종 결과인 125를 출력합니다.

While 반복문 코드 분석

두 번째 부분은 while 반복문을 이용해 6의 2제곱()을 계산합니다.

  • base = 6: 거듭제곱의 밑이 되는 값 6을 base 변수에 할당합니다.
  • exponent = 2: 지수 값 2를 exponent 변수에 할당합니다.
  • result = 1: 결과 값을 저장할 변수 result를 1로 초기화합니다.
  • while exponent > 0:: exponent의 값이 0보다 클 때까지 반복합니다.
  • result *= base: for문과 마찬가지로, 반복할 때마다 result에 base 값을 곱합니다.
    • 1번째 반복: result는 1 * 6으로 6이 됩니다.
  • exponent -= 1: 반복할 때마다 exponent의 값을 1씩 감소시킵니다.
    • 1번째 반복 후 exponent는 1이 됩니다.
    • 2번째 반복: result는 6 * 6으로 36이 됩니다. exponent는 0이 되어 반복문이 종료됩니다.
  • print(f"6의 2제곱: {result}"): 최종 결과인 36을 출력합니다.

두 예제 모두 거듭제곱이 밑을 지수만큼 곱하는 과정이라는 수학적 개념을 코드로 직접 구현했다는 점에서 의미가 있습니다.

 

#5. 팩토리 함수를 사용한 거듭제곱 계산

이 코드는 PowerCalculator 클래스를 팩토리 함수의 역할을 하는 create_power_calculator() 함수를 통해 생성합니다. 이 함수는 어떤 제곱을 계산할지(2제곱, 3제곱, 4제곱)를 결정하여 적절한 PowerCalculator 인스턴스를 반환합니다.

# 거듭제곱을 계산하는 클래스
class PowerCalculator:
    def __init__(self, exponent):
        """
        초기화 시 거듭제곱할 지수(exponent)를 설정합니다.
        """
        self.exponent = exponent
    
    def calculate(self, number):
        """
        주어진 숫자를 미리 설정된 지수만큼 거듭제곱하여 반환합니다.
        """
        return number ** self.exponent

# 팩토리 함수
def create_power_calculator(exponent_type):
    """
    팩토리 함수: exponent_type에 따라 적절한 PowerCalculator 객체를 생성하여 반환합니다.
    """
    if exponent_type == 'square':
        return PowerCalculator(2)
    elif exponent_type == 'cube':
        return PowerCalculator(3)
    elif exponent_type == 'fourth':
        return PowerCalculator(4)
    else:
        raise ValueError("지원하지 않는 제곱 타입입니다. ('square', 'cube', 'fourth' 중 하나를 선택하세요)")

# 팩토리 함수를 사용하여 객체 생성 및 사용
square_calc = create_power_calculator('square')  # 2제곱 계산기 생성
print(f"5의 2제곱: {square_calc.calculate(5)}") # 출력: 5의 2제곱: 25

cube_calc = create_power_calculator('cube')      # 3제곱 계산기 생성
print(f"3의 3제곱: {cube_calc.calculate(3)}")   # 출력: 3의 3제곱: 27

fourth_calc = create_power_calculator('fourth')    # 4제곱 계산기 생성
print(f"2의 4제곱: {fourth_calc.calculate(2)}")   # 출력: 2의 4제곱: 16

 

코드 분석

이 코드는 크게 세 부분으로 나눌 수 있습니다: PowerCalculator 클래스, create_power_calculator 팩토리 함수, 그리고 이들을 사용하는 부분입니다.

1. PowerCalculator 클래스

  • class PowerCalculator:: 이 클래스는 실제 거듭제곱 계산을 담당하는 제품(Product) 역할을 합니다.
  • def __init__(self, exponent):: 이 생성자는 객체가 생성될 때 호출되며, exponent (지수) 값을 인스턴스 변수로 저장합니다. 예를 들어, PowerCalculator(2)는 2제곱을 위한 계산기를 만듭니다.
  • def calculate(self, number):: 이 메서드는 주어진 **number (밑)**를 생성자에서 설정된 지수만큼 거듭제곱하여 결과를 반환합니다. number ** self.exponent 구문을 통해 계산이 이루어집니다.

2. create_power_calculator 팩토리 함수

  • def create_power_calculator(exponent_type):: 이 함수가 바로 팩토리(Factory) 역할을 합니다. 이 함수는 문자열('square', 'cube', 'fourth')을 입력받아 어떤 종류의 PowerCalculator 객체를 만들지 결정합니다.
  • if...elif...else: 이 조건문을 통해 exponent_type 값에 따라 PowerCalculator 클래스의 인스턴스를 동적으로 생성합니다. 예를 들어, 'square'를 입력받으면 PowerCalculator(2) 객체를 생성하여 2제곱을 계산할 수 있는 계산기를 반환합니다.
  • raise ValueError(...): 만약 지원하지 않는 타입이 입력되면 오류를 발생시켜 잘못된 사용을 방지합니다.

3. 객체 생성 및 사용

  • square_calc = create_power_calculator('square'): create_power_calculator 함수를 호출하여 2제곱을 계산하는 객체를 square_calc 변수에 할당합니다. 사용자는 PowerCalculator 클래스의 이름을 직접 호출하지 않아도 됩니다.
  • print(f"5의 2제곱: {square_calc.calculate(5)}"): 생성된 square_calc 객체의 calculate() 메서드를 호출하여 5의 2제곱을 계산합니다.
  • cube_calc와 fourth_calc도 마찬가지로, 각각 3제곱과 4제곱을 계산하는 객체를 팩토리 함수를 통해 생성하고 사용합니다.

핵심 개념

이 코드는 팩토리 디자인 패턴의 좋은 예시입니다.

  • 객체 생성 로직을 캡슐화: 사용자는 create_power_calculator 함수만 알면 원하는 계산기 객체를 얻을 수 있습니다. 객체가 어떻게 생성되는지(예: PowerCalculator 클래스가 필요하다는 것)를 몰라도 됩니다.
  • 결합도(Coupling)를 낮춤: 팩토리 함수를 사용함으로써, 클라이언트 코드(객체를 사용하는 부분)가 특정 클래스(PowerCalculator)에 직접적으로 종속되지 않습니다. 만약 나중에 5제곱 계산기가 추가되더라도, create_power_calculator 함수만 수정하면 되고, 클라이언트 코드는 변경할 필요가 없습니다.