알고리즘 주차에 들어서 주로 하는 것이 코드카타(알고리즘)를 푸는게 하루의 일과의 대부분이다.

그래서 캠프에서 주어진 하루 숙제 개념인 코드카타를 사전 캠프를 포함하여 저번 주까지 못 풀 때까지 계속 풀 다보니 조원들이 풀었던 부분보다 많이 풀게 되었다.

 

그러다보니 팀별 코드리뷰를 할 때 문제가 생겨서 캠프에서 주는 것을 빼고 다른 문제로 진행하기로 했다. 그와 함께 나는 지금까지 풀던 문제는 과감히 손에 놓고 다시 처음 부터 복습 하는 개념으로 풀기로 했다.

 

지금까지 파이썬을 배워왔던 게 있어서 그런지 코드가 전보다 줄어 든게 보였다.

def solution1(x):
    answer = True
    strs = str(x)
    sum_val = 0
    for i in range(len(strs)):
        sum_val += int(strs[i])

    if x % sum_val != 0:
        answer = False
	return answer
   

def modi_solution1(x):
	total = 0
    for num in list(str(x)):
        total += int(num)

    return True if x % total == 0 else False

이처럼 문법에 익숙해지 간결하게 코드가 만들어지는 이래서 파이썬을 쓰는 구나 할 때가 생긴다.

아마 조금만 더한다면 한줄로 코딩이 가능해 지지 않을까 생각이 든다.

 

그리고 복습을 하며 단순히 파이썬 문법을 적용 하는 방향이 아닌 최대한 코드를 더 최적화 하는 방법이 없나 하는 생각이 들어 쉬운 문제라도 일단 조금더 생각을 하게 된다.

def solution8(angle):
    re_val = 0
    if 0 < angle < 90:
        re_val = 1
    elif angle == 90 :
        re_val = 2
    elif 90 < angle < 180 :
        re_val = 3
    elif angle == 180 :
        re_val = 4
    else :
        re_val = -1

    return re_val
    
    
def update_solution8(angle):
    re_val = (angle // 90) * 2
    if angle % 90 > 0:
        re_val += 1

    return re_val

위의 코드가 대표적으로 좀 더 생각을 하여 푼 문제이다. 단순히 조건문 5개로 도 문제를 풀 수 있으나 어떻게 조건문 하나로 풀 수 있는게 없나 생각하여 시간을 가지니 아래의 코드로 문제를 풀 수 있게 되었다.

 

물론 파이썬 문법에 익숙하다고 코드를 줄인다고 동작 속도가 주는 건 아니다.

def solution6(n):
    answer = 0
    if 0 <= n <= 3000:
        k = 1
        while k <= n:
            if n % k == 0:
                answer += k
            k += 1
    else:
        answer = -1
    return answer


# 기존 코드보다 길어 졌으나 시간복잡도가 줄어 들었다.
"""
테스트 1 〉	통과 (0.00ms, 10.2MB)	테스트 1 〉	통과 (0.00ms, 10.1MB)
테스트 2 〉	통과 (0.01ms, 10.2MB)	테스트 2 〉	통과 (0.00ms, 10.3MB)
테스트 3 〉	통과 (0.11ms, 10.1MB)	테스트 3 〉	통과 (0.01ms, 10.1MB)
테스트 4 〉	통과 (0.03ms, 10.2MB)	테스트 4 〉	통과 (0.01ms, 10.2MB)
테스트 5 〉	통과 (0.22ms, 10.2MB)	테스트 5 〉	통과 (0.01ms, 10.3MB)
테스트 6 〉	통과 (0.05ms, 10.1MB)	테스트 6 〉	통과 (0.01ms, 10.1MB)
테스트 7 〉	통과 (0.38ms, 10.2MB)	테스트 7 〉	통과 (0.18ms, 10.2MB)
테스트 8 〉	통과 (0.04ms, 10.2MB)	테스트 8 〉	통과 (0.00ms, 10.1MB)
테스트 9 〉	통과 (0.33ms, 10.2MB)	테스트 9 〉	통과 (0.08ms, 10.3MB)
테스트 10 〉	통과 (0.36ms, 10.3MB)	테스트 10 〉	통과 (0.01ms, 10.3MB)
테스트 11 〉	통과 (0.31ms, 10.1MB)	테스트 11 〉	통과 (0.01ms, 10.3MB)
테스트 12 〉	통과 (0.24ms, 10.3MB)	테스트 12 〉	통과 (0.01ms, 10.3MB)
테스트 13 〉	통과 (0.01ms, 10.1MB)	테스트 13 〉	통과 (0.01ms, 10.2MB)
테스트 14 〉	통과 (0.31ms, 10.2MB)	테스트 14 〉	통과 (0.01ms, 10.2MB)
테스트 15 〉	통과 (0.17ms, 10.2MB)	테스트 15 〉	통과 (0.03ms, 10.2MB)
테스트 16 〉	통과 (0.00ms, 10.3MB)	테스트 16 〉	통과 (0.00ms, 10.3MB)
테스트 17 〉	통과 (0.28ms, 10.4MB)	테스트 17 〉	통과 (0.01ms, 10.1MB)
"""
def modi_solution6(n):
    if n == 1 or n == 0:
        return n

    answer = 1 + n
    max = n
    k = 2
    while max > k:
        if n % k == 0:
            answer += k
            answer += (n // k) if (n // k) > k else 0
            max = n // k
        k += 1
    return answer

 

위의 코드는 코드 길이는 길어 졌으나 시간 복잡도가 줄어 들게 되어 좀더 빨리 결과를 얻을 수 있게 된 코드이다.

 

이처럼 코드가 줄면 좋은 경두도 있으나 반대로 코드가 길어져서 좋은 점도 분명히 있다. 그러니 이를 잘 활용하요 적절하게 사용하는 앞으로의 숙제가 될거 같다.

'기타' 카테고리의 다른 글

Git 특강 - branch 와 merge(Local)  (0) 2024.08.16
(오답노트)모의 기술 면접  (0) 2024.08.08
프로젝트 진행을 위한 git&github 셋팅  (0) 2024.07.03
Git 강의 2  (0) 2024.07.02
VSCODE에서 venv 가 활성화가 안될 때  (0) 2024.06.27

+ Recent posts