4주 차 알고리즘 주차가 시작됐다.
학습목적은 자료구조/알로리즘과 컴퓨팅사고를 통해 주어진 문제를 얼마나 효율적으로 깔끔하게 해결할 수 있는가가 이번 주차의 목적이다.
일단 컴퓨팅 사고는 문제를 효과적으로 정의하고 풀어나가는 사고방식인데 잘 설명해 주셨지만 문제를 분해해서 인식하고 이것을 해결하는? 이 정도만 기억에 남았다...
시간 복잡도와 배열과 연결 리스트의 구분과 로그 등 문제에 대해 다양한 하게 알려 주셨다. (다시 한번 듣기)
최대한 문제를 분해하고 패턴을 인식하고 추상화하여 알고리즘 만들기? 실전에서 사용하며 문제를 풀어 보았다.
짝수의 합
문제
정수 n이 주어질 때, n이하의 짝수를 모두 더한 값을 return 하도록 solution 함수를 작성해주세요.
입출력 예
n = 10
result = 30
n이 10 이므로 2 + 4 + 6 + 8 + 10 =30 return 합니다.
def solution(n):
answer = 0
return answer
1. 일단 n이 정수의 짝수들을 구한다.
2. 짝수들을 하나하나 더한다.
3. 더한 짝수를 return 한다.
처음 생각한 방식은
def solution(n):
a = 0
for i in range(1,(n//2)+1):
a = a +(2*i)
return a
n을 2로 나눈 몫을 구해 짝수가 얼마나 있는지 확인하고
range를 통해 1 ~ (n//2)+1 범위 안에 수를 i에게 부여해한다. +1을 해준 이유는 짝수로 떨어진 자면 마지막 짝수 자리 숫자가 출력이 불가능해요 추가했다.
i에서 나온 숫자를 2를 곱해 차근차근 a의 변수에 저장해게하여 끝까지 for 반복문을 돌게 했다.
반복문을 빠져나오면 a값을 return 해주면 끝
추후에 range 함수에 모르는 부분이 있어다.
range(start, stop, step) 형식으로 마지막에 인자를 넣으면 숫가 간의 간격을 만들 수 있는 부분이었다.
def solution(n):
a = 0
for i in range(0,n+1,2):
a +=i
return a
다신 이렇게 깔끔하게 정리를 했다.
range라는 함수를 나중에도 자주 사용하는 거 같은데 이번에 확실하게 알아주고 넘어갈 수 있는 기회였다.
다른 사람들이 푼 문제 중에는 sum이라는 함수를 이용하여
def solution(n):
return sum(range(0,n+1,2))
아주 간단하게 두줄로 끝내는 경우도 있었다.
그중에서도 가장 기억에 남는 것은
def solution(n):
return 2*(n//2)*((n//2)+1)/2
등차수열 2n의 합공식을 이용했다는데... 이 부분은 따로 더 찾아봐야 할 부분인 거 같다.
역시 수학공부를 더 했어야 하나ㅠㅠ
마무리
내일도 여러 알고리즘 문제를 풀어나가며 재미있는 유형을 볼 생각 하니 벌써 기대가 된다.
오늘 배운 컴퓨징사고를 기반으로 차근차근 노트에 작성하며 푸는 연습을 통해 내 것으로 만들어야겠다.