본문 바로가기
Python

본 캠프 Python 알고리즘 코드카타 4일차

by Data 학습자 2024. 6. 27.

오늘 풀어본 파이썬 문제

https://school.programmers.co.kr/learn/courses/30/lessons/12940

 

프로그래머스

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

programmers.co.kr

 

 

내가 직접 풀어본 코드문

def solution(n, m):
    if n > m:
        a, b = m, n
    else:
        a, b = n, m
        
    for i in range(b):
        if b == 0:
            break
        a, b = b, a % b
    
    gcd = a
    lcm = (n * m) // gcd
    
    return [gcd, lcm]

 

내가 직접 풀어서 짜본 코드문

 

무엇보다 가장 어려웠던 부분은

    for i in range(b):
        if b == 0:
            break

이 코드문을 머리속에 떠올릴때까지 너무 오래 걸렸다는 점이다.

 

그리고 이 코드문의 기능을 단 하나의 명령어로 대체가 가능하다는 이야기를 듣게 되었다.

그 명령어는 바로 while 이다.

 

for 문은 무조건 지정되어 있는 횟수만큼 반복을 해야하지만 while의 특징은 특정 조건을 달성할때까지 무한정으로 반복하는 함수이다

 

그러므로 이걸 알게 된 뒤의 직접짜 본 나의 코드문은

def solution(n, m):
    if n > m:
        a, b = m, n
        
        while b:
            a, b = b, a % b
            
        gcd = a
        lcm = (n * m) // gcd
        
    else:
        a, b = n, m
        
        while b:
            a, b = b, a % b
            
        gcd = a
        lcm = (n * m) // gcd
    
    return [gcd, lcm]

 

무엇인가 좀 더 기괴해지고 비효율적인 느낌이 들었다.

 

아무리봐도 for 문보다 비효율적인 모양새가 되어버려서 정답은 어떤 형태를 하고 있나 찾아보기로 하였다.

def solution(n, m):
    
    a, b = n, m
    while b:
        a, b = b, a % b
    gcd = a
    
    # 최소공배수(LCM) 계산
    lcm = (n * m) // gcd
    
    return [gcd, lcm]

그 동안 너무 혼자 독학만 해서 그런지 이런식으로 접근해 볼 생각을 하지 못했다.

 

어차피 n이 더 크든 m이 더 크든지간에 원하는 조건값이 나올때까지 반복한다는 while의 특징에 대해 다소 안일하게 생각했던 것 같다.

 

오늘 배운 것

  • while의 사용법과 역할 및 특징

  • 고이면 썩는다는 말을 공부하면서도 느껴졌으며 좀 더 튜터님에게 의지를 해야겠다라는 생각이 들었다.