알고리즘 주차에 들어서 주로 하는 것이 코드카타(알고리즘)를 푸는게 하루의 일과의 대부분이다.
그래서 캠프에서 주어진 하루 숙제 개념인 코드카타를 사전 캠프를 포함하여 저번 주까지 못 풀 때까지 계속 풀 다보니 조원들이 풀었던 부분보다 많이 풀게 되었다.
그러다보니 팀별 코드리뷰를 할 때 문제가 생겨서 캠프에서 주는 것을 빼고 다른 문제로 진행하기로 했다. 그와 함께 나는 지금까지 풀던 문제는 과감히 손에 놓고 다시 처음 부터 복습 하는 개념으로 풀기로 했다.
지금까지 파이썬을 배워왔던 게 있어서 그런지 코드가 전보다 줄어 든게 보였다.
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 |