관리 메뉴

솜씨좋은장씨

[Programmers] 다음에 올 숫자 (Python) (feat.ChatGPT) 본문

Programming/코딩 1일 1문제

[Programmers] 다음에 올 숫자 (Python) (feat.ChatGPT)

솜씨좋은장씨 2023. 4. 6. 13:34
728x90
반응형

코딩 1일 1문제! 오늘의 문제는 프로그래머스의 다음에 올 숫자 입니다.

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

👨🏻‍💻 문제 풀이 - SOMJANG

1. 리스트의 모든 원소의 등차와 등비를 구하고 각각 등차, 등비를 저장하는 list 에 저장합니다.

   ㄴ 등비를 구할때는 수열에 0이 들어있을 경우를 대비하여야 합니다.

 

2. 이렇게 각각 저장해 둔 list 를 set 으로 만들었을때 길이가 1이 되는 list 가

    ㄴ 등차를 저장한 list 이면 -> 이 리스트는 등차 수열 -> 1 과 등차를 return

    ㄴ 등비를 저장한 list 이면 -> 이 리스느는 등비 수열 -> 2 와 등비를 return

    이라고 판단 합니다.

 

3. 등차 수열일 경우 -> 입력 받은 리스트의 마지막 값에 등차를 더한 값을 정답으로

    등비 수열일 경우 -> 입력 받은 리스트의 마지막 값에 등비를 곱한 값을 정답으로 하였습니다.

👨🏻‍💻 코드 (Solution) - SOMJANG

def is_arithmetic_or_geometric(common):
    arithmetic_diff_list = []
    geometric_diff_list = []
    
    option = 0
    
    for idx in range(len(common)-1):
        arithmetic_diff_list.append(common[idx+1] - common[idx])
        geometric_diff_list.append(common[idx+1] / common[idx] if common[idx] != 0 else 0)
        
    if len(set(arithmetic_diff_list)) == 1:
        return 1, arithmetic_diff_list[-1]
    elif len(set(geometric_diff_list)) == 1:
        return 2, geometric_diff_list[-1]
        
    
def get_next_number(last_num, diff_num, option):
    """
    option : 1 - arithmetic 2 - geometric
    """
    
    if option == 1:
        return last_num + diff_num
    elif option == 2:
        return int(last_num * diff_num)
        


def solution(common):
    option, diff_num = is_arithmetic_or_geometric(common)
    
    return get_next_number(
        last_num=common[-1], 
        diff_num=diff_num, 
        option=option
    )

👨🏻‍💻 문제 풀이 - ChatGPT

주어진 리스트 common이 등차수열인지, 등비수열인지 확인하고, 그에 따라 다음에 올 숫자를 계산하여 반환하는 함수를 작성할 수 있습니다.

등차수열일 경우, 마지막 원소와 그 이전 원소의 차이를 구하면 공차가 됩니다. 따라서, 마지막 원소에 공차를 더한 값이 다음에 올 숫자가 됩니다.

등비수열일 경우, 마지막 원소와 그 이전 원소의 비율을 구하면 공비가 됩니다. 따라서, 마지막 원소에 공비를 곱한 값이 다음에 올 숫자가 됩니다.

아래는 Python으로 작성한 함수의 예시입니다.

예를 들어, solution([1, 2, 3, 4])를 호출하면, 등차수열이므로 4와 3의 차이는 1이므로, 4 + 1 = 5를 반환합니다. solution([2, 4, 8])을 호출하면, 등비수열이므로 8을 4로 나눈 값인 2를 곱해 16을 반환합니다.

👨🏻‍💻 코드 (Solution) - ChatGPT

def solution(common):
    # 등차수열인 경우
    if common[1] - common[0] == common[-1] - common[-2]:
        return common[-1] + (common[1] - common[0])
    # 등비수열인 경우
    else:
        return common[-1] * (common[-1] // common[-2])

여러 케이스를 생각하느라 장황하게 여러개의 함수로 작성한 저와는 다르게

문제에서 말한 input 제한 사항을 최대한 활용하여 아주 간결한 코드를 작성해주었습니다.

이와 비슷한 코드가 다른 사람의 풀이에 많이 있는 것을 보면

뭔가 github 에서 가져온 학습 데이터 중에 이런 코드가 있었나? 라는 생각도 들기도 했습니다.

 

ChatGPT 의 문제풀이는 매번 새로운 느낌 인 것 같습니다.

 

GitHub - SOMJANG/CODINGTEST_PRACTICE: 1일 1문제 since 2020.02.07

1일 1문제 since 2020.02.07. Contribute to SOMJANG/CODINGTEST_PRACTICE development by creating an account on GitHub.

github.com

Comments