
2022-10-15
정글에서 살아남기 Week 04
Graph, DFS, BFS
4주차 개발일지
First step, Next step
알고리즘의 마지막 주차, 어느덧 한 달이 지났다. 정글에 첫 발걸음을 내딛고 빠르게 지나온 과거의 나를 생각해보면 많이 성장했지만 그래도 아쉽다. 한주 한주가 지날수록 생각이 많아진다. 이 또한 성장하는 과정이겠지만 최고의 결과를 내고 싶기에 고민이 많아지는 것 같다. 이제는 문제는 어느 정도 풀리지만 근본을 많이 놓치고 있다는 생각이 많이 들었다. 코치님께서 조언해주신 글을 보고 많은 생각과 회고를 하게 되었다. 나름 혼자만의 방법을 찾기 위해 정리를 해봤는데 다음과 같다. 4주차 발제를 듣고 어느 정도 인지는 하고 있었지만 현재 과정이 모든 파트를 경험하는 것이 아닌 많은 부분을 생략하고 지나간다는 것, 내 생각보다 훨씬 방대한 양의 지식을 필요로 한다는 것에 힘이 조금 빠졌지만, 우선 여기서 익힌 것을 최대한 나의 것으로 만들고, 추후에 학습 능력을 바탕으로 많은 지식을 습득해내기로 결론을 지었다.
책과 자료를 통해 기초를 다지자 어려울 때는 한 줄씩 파악 ( 출력 및 디버깅 해보면서 확인 )
Q1. 내가 생각한 것을 프로그램으로 만들 수 있는지 --> 이 과정의 가장 근본적인 목표는 내가 원하는 작업을 컴퓨터에게 시키는 능력을 키우는 것
- 계산 복잡도를 고려
- 문제 유형을 나누어 익히기
- 정해진 시간 안에 프로그램을 짜는 연습
Q2. 재귀 함수 (recursive function)
- 재귀 함수라는 >> 수열 점화식 점화식: a_{k+1} = a_{k} + 1, a_1 = 1 와 같이 다른 수와의 연관을 표현한 식 일반식: a_{n} = n 와 같이 일반적인 함수 형태로 나타낸 식
Q3. 각 주의 keyword 들은 서로 연관이 있다. ex) 분할 정복은 재귀함수로 구현하기 좋습니다. 이분 탐색은 분할 정복의 한 가지 방법입니다. 재귀 함수를 반복문(loop)으로 바꿀 때 스택을 사용하면 쉽게 바꿀 수 있습니다. (문제에 따라서는 스택을 안 쓰고도 바꿀 수 있습니다.) 반대로 반복문은 재귀 함수로 바꿀 수 있습니다. loop 변수를 재귀 함수의 argument로 쓰면 쉽게 만들 수 있죠? 정수론이란 키워드는 우리가 다루는 문제는 정수(integer)밖에 다루지 않을것이라는 암시를 줍니다. 정수는 수의 극히 일부분이므로 수학의 아주 작은 부분만 활용하게 됩니다.
ps. 참고로, 여러분의 computer에게 0.1 + 0.2를 연산하라고 하면 뭐라고 답하는지 확인해 보십시오. 왜 그런지 파헤치기 시작하면 시간낭비일 수 있으니, 그냥 "2진수와 10진수의 차이와 용량의 한계 때문이다" 정도로만 알고 계십시오. (IEEE 754를 보는 시간에 차라리 2's-complement를 이해하는 것이 낫고, 2's-complement를 이해할 시간에 다른 알고리즘을 이해하는 게 지금은 효율적이라고 봅니다.) 각각의 풀이 방법을 외우려고 하지 않고 이런 연관성을 가지고 보면, 컴퓨터로 풀 수 있는 문제의 모양을 보는 데 도움이 되리라고 생각합니다. 과연 이번 주의 그래프 문제들은 지난 주의 키워드들과 어떤 연관성을 가지고 있을까요?
Q4. 주어진 시간 안에 문제를 푸는 연습
- 하, 중 문제를 늦어도 30분 안에는 구현하도록 연습 (이미 아는 문제부터 연습)
ps. 4개월 후에는 난이도 하 문제는 5~20분 안에 풀 수 있도록, 문제를 읽고 30초 안에 풀이 방법을 말할 수 있도록 훈련 되어있는 것이 좋습니다. 이 과정이 코딩 테스트를 위한 과정은 아닙니다만, 주어진 시간 안에 푸는 연습이 안되면 코테나 면접에도 도움이 안 됩니다. 칠판 코딩 면접을 생각해 보면, 면접관이 질문했는데 30초를 기다려도 답을 들을 수 없다면 다음 문제로 넘어갈 수 밖에 없습니다. 현실적으로 면접에서 한 문제에 30분 이상을 할애하기 어렵습니다.
A1.
시간 복잡도에 대한 개념 공부 필요 시간 및 계산복잡도에 따라 가능한 효율적이고 간편한 기능 활용 ( 각 기능 및 함수에 대한 시간복잡도 및 계산 과정 지식 필요) 타이머를 맞추고 30분 안에 문제를 풀고 못풀 시 코드를 구현하는 연습을 하도록 한다.
A2.
재귀함수에 관한 다양한 문제를 풀고 구현해보는 연습을 통해 적재적소에 활용할 수 있도록 연습이 필요하다.
A3.
각 주차의 기본개념에 대한 확실한 이해와 활용 연습이 필요하며, 연관성에 초점을 두고 생각해보고, 다양한 방법이 존재함을 인지한다.
A4.
최종 목표에 대한 고찰 (시간복잡도를 확인, 알고리즘 작성, 활용할 기술 중 시간복잡도에 따른 선택, 코드 구현) / 최종적으로는 내가 원하는 작업을 컴퓨터에게 시키는 능력을 키우는 것

정글에서 살아남기 Week 03
Divide and Conquer, Stack, Queue

정글에서 살아남기 Week 05
Dymamic Programming, Greedy Algorithm