Daily Algorithm - Day 0

105·2024년 12월 21일
0

Daily Algorithm

목록 보기
1/30

Python 공부를 재시작하면서 강의를 듣던 중 간단한 알고리즘 구현 문제를 풀게 되었다.

Q. 1,000 미만의 자연수에서 3의 배수와 5의 배수의 총합을 구하라.

내가 해당 알고리즘을 구현하기 위해 고안한 방식은

  1. 3의 배수를 전부 배열에 추가한다.
  2. 5의 배수를 전부 배열에 추가한다.
  3. 배열에서 중복되는 숫자(=공배수)를 제거한 후 전부 더한다.

이며, 그렇게 나온 코드가 다음과 같다.

//Python

third = [] # 3의 배수의 리스트
fifth = [] # 5의 배수의 리스트

for i in range(1, 1000):
    if i % 3 == 0 :
        third.append(i)  

for i in range(1, 1000):
    if i % 5 == 0 :
        fifth.append(i) 

filtering = list(set(third + fifth)) # 리스트 2개를 합쳐서 중복 값을 제거 (list -> data -> list)
answer = sum(filtering)  # 중복값이 사라진 리스트의 값을 전부 합침침

print(answer)

>>> 233168

답은 맞게 나왔으나, 코드를 다시 살펴본 후 나는 무언가 이상함을 느꼈다.
우선 for 문을 2번에 나눠서 사용할 이유가 없고, or를 이용하면 공배수가 중복으로 들어갈 일도 없으니 그 이후의 코드는 전부 불필요해진다.

그렇다면 다음과 같이 코드를 개선할 수 있을 것이다.

answer = []

# 3의 배수거나 5의 배수라면 answer에 전부 추가해준다.
for i in range(1, 1000):
    if i % 3 == 0 or i % 5 == 0: 
        answer.append(i)

print(sum(answer))

>>> 233168

이 과정을 통해서 나의 부족함을 느끼고 Daily Algorithm을 실천하기로 결심했다.

금일부터 1년간 Project Euler를 참고하여 매일 알고리즘을 구현한 코드를 커밋하고, 스스로의 풀이 과정을 블로그에 정리할 예정이다.
Daily Algorithm의 목적은 다음과 같다.

  1. 수학적 사고력을 키운다
  2. 집에서 pc를 켰을 때 바로 공부를 하는 습관을 만든다
  3. 보다 효율적인 코드를 작성하는 능력을 기른다.

그리고 이를 진행하면서 지킬 규칙은 다음과 같다.

  1. Daily Algorithm 이외의 공부와 프로젝트를 병행할 것
    알고리즘에 대비하는 것도 중요하지만, 결국 엔지니어를 목표로 하는 이상 실무에서의 실력을 늘리는 것이 중요하다. 개발 언어와 프레임워크에 대한 공부, 프로젝트 실습을 병행하는 것이 더 좋은 개발자로 발전할 수 있을 것이다. 알고리즘 1개를 해결했으면 다른 곳에 시간을 투자하자.

  2. 하루에 2시간 이하로 투자할 것
    초기에는 간단한 알고리즘을 다루어 하루에 10분 미만으로 시작하겠지만, 후반으로 가면 시간을 많이 들여야하는 알고리즘과 마주할 것이다. 2시간이 지나도 해결하지 못하는 날에는 빠르게 타인의 구현을 참고하고 해당 사실을 솔직하게 적어두자. 그리고 1주일 뒤에 재도전 해보도록 하자.

  3. Java의 학습을 어느정도 진행한 후에는 Java -> Python 순으로 진행할 것
    글 작성 시점에는 Java에 관한 지식이 전무해서 한동안 Python으로만 진행을 할 예정이지만, Java를 이용한 알고리즘 구현 후, Pythonic한 알고리즘으로 리팩토링을 하는 것을 목표로 한다.

  4. 최대한 매일 갱신하는 것을 목표로 하되, 거기에 매몰되지 말자.
    언젠가 pc에 1초도 손을 대지 못하는 날이 올 수도 있다. 물론 예비 커밋분을 준비해놓는 것도 가능하지만, 이 행위의 본질은 학습이지 github 색칠하기가 아니다. 사유만 잘 남겨두고 커밋은 포기하도록 하자.

이상이다.
앞으로 1년 동안 열심히 해보자.

profile
focus on backend

0개의 댓글