반응형
오늘 버블소트 문제를 풀어봤다.
코드 자체는 익숙했지만 왜 그렇게 논리가 구성되었는지는 고민을 해본 적이 없었다. 또 다른 정렬 문제가 나왔을 때 버블소트로 풀려고 한다면 코드의 논리를 이해해야한다고 생각했다. 따라서 버블소트의 코드를 보면서 이해하는 과정을 적어봤다. 다른 알고리즘도 비슷하게 공부할 수 있겠다는 생각이 들었기 때문이다.
알고리즘은 다음의 방법으로 분해해봤다.
- 코드 훑어보기
- 알고리즘의 목적 파악하기
- 알고리즘 적용시 구체적인 결과 파악하기
- 알고리즘이 해결하는 문제를 작은 문제로 쪼개기
- 각각의 문제를 코드로 옮겨 보기
- 내코드와 알고리즘 코드 비교
버블 소트를 예로 들어보자.
1. 코드 훑어보기: 코드 전체의 구조를 눈에 익힌다.
def bubble_sort(nums):
swapping = True
end = len(nums)
while swapping:
swapping = False
for i in range(1, end):
if nums[i-1] > nums[i]:
nums[i-1], nums[i] = nums[i], nums[i-1]
swapping = True
end -= 1
return nums
2. 목적파악: 버블 소트의 목적은 리스트 내의 데이터의 정렬이다.
3. 예상 결과 파악: 리스트 내의 데이터는 리스트의 오른쪽을 갈수록 커진다
4. 문제 쪼개기: 알고리즘에 따라 문제가 결정된다. 핵심은 작은 문제에서 큰문제 방향으로 정의하는 것이다.
더보기
문제 쪼개기 예시
- 딱 달라붙어 있는 데이터 둘을 볼 때, 큰 것이 오른쪽으로 와야한다.
- 가장 큰 데이터는 리스트의 가장 오른 쪽에 있어야한다
- 리스트의 데이터는 왼쪽에서 오른쪽으로 갈때 점점 커져야한다.
5. 코드 작성 연습하기: 쪼개진 문제를 가지고 코드로 옮겨본다
6. 내코드와 알고리즘 코드 비교
코드 작성 팁
- 결국 코드는 하나의 단순한 레시피부터 여러개의 레시피의 조합으로 이뤄진 것 같다.
- 알고리즘은 레시피랑 비슷한 것 같다. 레시피에 필요한 재료들을 먼저 준비한 후, 순서에 따라서 조리를 한다. 조리가 끝나면 요리가 준비된다. 알고리즘도 같다. 문제를 풀기 위한 데이터(재료)를 먼저 적는다. 그다음 문제 풀이를 작성한다. 그리고 결과를 반환한다.
인사이트
- 알고리즘을 이해하려면 일단 해결하려는 문제부터 파악하자. 그리고 그문제를 파악하기 위해 가장 작은 문제부터 찾아서 이해한 후에 문제의 범위를 넓혀 나가자.
- 알고리즘을 내것으로 만드려면 각 단계가 필요한 이유를 설명할 수 있어야한다.
- 방도 정리하면 보기가 좋은 것처럼 코드들도 모아서 정리하는 것이 좋다. 준비물 데이터는 앞단에, 레시피와 같은 알고리즘은 가운데에, 요리인 결과물은 끝에 배치하자.
- 코드는 하나의 레시피일 수도 있고 여러개의 레시피가 모인 것일 수도 있다.
반응형