아자아자 화이팅이닷 !

230821 프로그래머스 문제풀기 본문

TIL

230821 프로그래머스 문제풀기

유초23 2023. 8. 21. 23:15
728x90

* 구슬을 나누는 경우의 수 문제에서

 

문제 하단에 있는 힌트에

이렇게 쓰여있는걸 보고 팩토리얼을 사용하면 되겠다 싶었다 ,,!

 

우리가 팩토리얼을 구할때에는 3가지 방법을 사용할 수 있다.

 

첫번째는, for 반복문을 사용하는 것이다.

 

#for문을 사용한 팩토리얼 소스 코드
a = int(input("팩토리얼을 구할 숫자를 입력하세요 : "))
result = 1
for item in range(1, a+1, 1):
    result *= item      #result = result * item
print(result)

>>> 팩토리얼을 구할 숫자를 입력하세요 : 8
>>> 40320

 

두번째는, 재귀함수를 사용하는 것이다.

 

재귀함수란 함수 내부에서 자기자신을 호출하는 함수를 의미한다.

#재귀함수 사용
def my_factorial(n):
    if(n > 1):
        return n * my_factorial(n - 1)
    else:
        return 1

a = int(input("팩토리얼을 구할 숫자를 입력하세요 : "))
print(my_factorial(a))

>>> 팩토리얼을 구할 숫자를 입력하세요 : 5
>>> 120

 

def를 통해 my_factorial(n) 함수를 정의하였다.

여기에서 정의한 my_factorial이 재귀함수이다.

해당 함수는 입력받은 파라미터 값이 1 보다 크면  = 입력받은수 * my_factorial(n -1) 을 리턴한다.

 

사용자의 입력이 5인 경우

my_factorial(5) 호출

5 > 1, 따라서 5 * my_factorial(4) 호출

4 > 1, 따라서 4 * my_factorial(3) 호출

3 > 1, 따라서 3 * my_factorial(2) 호출

2 > 1, 따라서 2 * my_factorial(1) 호출

1 > 1는 거짓 따라서 1을 리턴함

 

세번째는, math라이브러리에서 제공하는 factorial함수를 사용하는 것이다.

 

#math라이브러리 사용
import math
a = int(input("팩토리얼을 구할 숫자를 입력하세요 : "))
print(math.factorial(a))

>>> 팩토리얼을 구할 숫자를 입력하세요 : 6
>>> 720

 

팩토리얼에 대한 쉬운 설명이 되어있는

https://blockdmask.tistory.com/528

 

[python] 파이썬 팩토리얼(factorial) 구하기 3가지 방법

안녕하세요. BlockDMask입니다. 오늘은 파이썬에서 팩토리얼을 구하는 3가지 방법에 대해서 이야기해보려 합니다. 1. 재귀를 이용한 팩토리얼 2. 반복을 이용한 팩토리얼 3. math.factorial 함수를 이용

blockdmask.tistory.com

를 참고하면 좋을 것 같다 !

 

그래서 나는 math함수를 import해서 이 문제를 해결하였다 !

import math

def solution(balls,share):
    return math.factorial(balls) / ((math.factorial(balls-share)) * math.factorial(share))

 

그런데 comb함수를 사용하면 더 쉽게 풀리는 문제였다 !

 

comb()함수는 comb(n,k) : 조합함수로

  • 반복과 순서 없이 n 개의 항목에서 k 개의 항목을 선택하는 방법의 수를 반환한다.

 

math.comb(M,N)를 사용하면 M개에서 N개를 조합으로 선택할 때의 경우의 수를 출력한다.

 

그래서

import math


def solution(balls, share):
    return math.comb(balls, share)

이렇게 하면 더 간단하게 풀 수 있다 !

WoW


* 삼각형의 완성조건(2) 문제에서는

 

처음에

def solution(sides):
    count = 0
    if k < sides[0] + sides[1]:
        k + min(sides) > max(sides)
        count += 1
    return count

이렇게 일단 짜긴 했는데 k를 어떻게 선언을 해야할지 모르겠어서 고민을 좀 했돠 ..

 

구글링을 해본 결과 아주 쉽게 푸는 코드가 있었다 ..

 

https://velog.io/@cindy0817-web/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-lv0-%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%82%BC%EA%B0%81%ED%98%95%EC%9D%98-%EC%99%84%EC%84%B1%EC%A1%B0%EA%B1%B42

 

[코딩테스트 lv0 파이썬]삼각형의 완성조건(2)

기존에 알고 있는 변이 a, b라고 하자.(a>b)이때, 새로 입력 받는 c가 a보다 클 수도 있고 같을 수도 있고 작을 수도 있다.선분 세 개로 삼각형을 만들기 위해서는 다음과 같은 조건을 만족해야 합니

velog.io

 

아주 쉽게 설명해 놓으셨다 !

 

그래서 결론적으로는 

def solution(sides):
    return 2*min(sides) - 1

이렇게 코드를 짜면 된다 !

 

c를 새로운 수라고 놓고, a가 sides에서 제일 큰 수, b가 sides에서 제일 작은수라고 놓고

경우의 수를 3가지로 놓은다음 계산을 하면 된다 !

 

좀 수학적으로 접근할 필요가 있던 문제였던 것 같돠 ,,


* 조건 문자열 문제는

 

처음 봤을때는 어떻게 풀어야할지 감이 안왔는데,

직관적으로 풀면 풀리는 문제였다 .!

 

그런데 이 문제는 eval()함수를 사용하면 간단하게 풀리는 문제였다 !

 

eval함수는 매개변수로 받은 식을 문자열로 받아서, 실행하는 함수이다.

 

https://blockdmask.tistory.com/437

 

[python] 파이썬 eval 함수 정리 및 예제

안녕하세요. BlockDMask 입니다. 오늘은 조금 색다른 함수인 eval 이라는 함수를 가지고 왔습니다. 이 함수는 간단해서 이해하는데는 문제가 없을 것 입니다. 하지만, 이 함수가 유용한게 맞는지 유

blockdmask.tistory.com

이걸 참고하면 좋을 것 같다 !

 

그래서 이 문제는

def solution(ineq, eq, n, m):
    return int(eval(str(n)+ineq+eq.replace('!', '')+str(m)))

이렇게 replace함수까지 써서 한줄로 끝낼 수 있는 문제여따 ..!

 

생각해내는게 어렵다 .. ㅜ


뭔가 건드려본건 꽤 있는데 실속은 잘 모르겠다 ㅠ

후에엥 ..

그래도 화이팅이닷 !

포기하지 말자고 ,,~!

728x90