파이썬 알고리즘 1주차 : 정렬에 관한 공부

정글일지 4

1.개발 진행 및 완료상황

  • 1주차 Python Algorithm 문제풀이 완료
  1. 업무, 개발 중 발생한 이슈/고민 또는 이를 해결한 내용
  • Quick sort를 이용하여 주어진 수를 오름차순으로 정렬하고 싶었다. 교과서로 Quick sort가 가장 빠르다고 읽어서, 그냥 가장 좋은 기능이겠거니 생각하였다. 코드도 복잡해지고 잘 안되어서 단순선택 정렬로 했다.
  • 주어진 정수 정렬하여 출력하는 문제에서 메모리가 적게 주어졌다. 다른 문제들처럼 하니 메모리 초과 문제로 오답처리 되었다. 입력되는 수의 개수는 10만개 이상이였지만 주어지는 수의 크기는 1만 이하였기에 분명히 겹칠 가능성이 있을거라 생각했다. 그래서 1만1개짜리 리스트(인덱스와 그 위치가 나타내는 수를 일치시키기 위해서)를 만들어 각 수가 나올때마다 그 수를 인덱스로히는 리스트의 원소를 1씩 늘려준 후 각 인덱스값을 원소만큼 출력하도록 반복함수를 구성하였다.
  • permutation을 이용하니 어렵던 문제들이 금방 풀렸다. 이 Library를 사용하지 않으면 재귀 알고리즘을 이용해야 한다. 수열을 사용하지 않고 재귀를 이용해 문제를 풀었으면 시간이 굉장히 오래걸려서 시험날까지 모든 문제를 못 풀었을 지도 모르겠다. 하지만 아직 재귀함수 구성이 어렵게 느껴지니 재귀함수를 자주 사용하고 반복해야겠다.
  • 경우의 수를 찾는 문제에서 이전에는 조건을 한정지어서 계산이 간편해지도록 하는 문제들이 있었다. 오히려 나중에는 정직하게 다양한 경우의 수를 구성하여 도출하고 결과를 비교하는게 답인 경우도 많았다. 아직 계산 복잡도나 여러가지를 고려하지 못하니 다양한 방법으로 풀어가는 연습을 해야겠다.
  • 새로 배운 내용

  • 리스트에서 중복을 없애고 싶으면 list를 set로 변환한 후 다시 list로 만들자.
  • abs는 절대값으로 변환해준다.
  • dfs는 재귀함수를 이용해 다양한 경로를 파악하는 방법중의 하나인것 같다. 버블정렬을 개선하여 계산,비교 등을 줄여 셰이커 정렬을 하듯 dfs도 그런 개념을 적용하면 좋을듯 하다.
  • DP는 피보나치 수열(a(n-2) + a(n-1) = a(n))로 생각하면 이해가 쉽다. 이전 계산 결과를 저장하여 똑같은 계산을 반복하는 것을 줄인다.
  • list를 print하면 [ ] 형태로 나오지만 *list를 print하면 원소만 출력된다.
  • 참고할 만한 레퍼런스들

  • 자료구조와 함께 배우는 알고리즘 입문 파이썬편(BohYoh Shibata 지음, 강민 옮김, 이지스 퍼블리싱)
  • 특이사항

  • 내일 시험이다.
  • 오늘이 1주차의 마지막 날이다.
  • 회고

  • 오늘은 알고리즘 문제를 풀때 30분 시간제한을 두었다. 30분이 지나면 아무리 아까워도 무조건 답지를 보고 공부하는 규칙을 만들었다. 확실히 진도도 빨라지고 의미없는 고민도 줄은 듯하다. 아직 개념이 부족하니 30분만 치열하게 생각하고 답안을 봐서 모르는 개념이 쓰였는지 확인하고 체득하는 습관을 들이자.
  • 답변을 읽고 이해가 되는건 배운것이 아니다. 답을 보지 않고 혼자 풀어낼 수 있어야 공부다. 2주차부턴 시간관리를 철저히 해서 모든 문제들을 확실하게 공부할 수 있게 해야겠다.
  • 내일부턴 급하게 문제푸느라 못읽었던 교과서들도 정해진 계획대로 읽어야겠다.
  • TO-DO-LIST
  1. 1주차 파이썬 알고리즘 시험보기
  2. CSAPP 읽기
  3. 파이썬 알고리즘 교과서 읽기