어제와 오늘은(특히 오늘은) 여태껏 배웠던 내용들을 전부 다 활용하여
운영진들이 우리가 여태껏 학습해 온 기본 개념을 활용해 풀 수 있도록
직접 만든 문제들을 풀어내는 알고리즘 시간이었다
그리고 나는 오늘 어제 적은 것(클릭) 처럼 알고리즘을 정리하려 했는데
일단은 두 가지 이유로 다 적진 못하고 간략하게만 적을 거 같다
첫째론, 이 문제는 프로그래머스나 백준과 같은 공용의 문제가 아니라, 저작권이 있는 문제라 모든 코드와 문제를 노출하기 어렵다
둘째론, 이 글을 볼 누군가에게 '정답과 해설' 이라기보단, '어떤 개념을 어떻게 썼다' 라고, 최대한 본인 주도적으로 문제 해결을 위해 미약하게나마 주는 힌트로서만 도움이 되고 싶었다
TMI 좀 더 해서 둘째에 관한 경험을 마저 적어보려고 한다
내가 컴공에 맞는지를 정말 고민할 때(아마 전역한 다음 해의 여름방학 이었을 것이다)
C 를 한 번 독학으로 공부한 후 백준에 가서 알고리즘 문제들이랍시고 몇 개를 풀어본 적이 있다
(자료 구조를 기반으로 해서 풀어내는 알고리즘이 아닌, 진짜 취미 수준으로 푸는 수준... 부끄럽다)
그리고 그 때 정말 소위 말하는 피똥을 싼 문제가 있었는데
바로 백준의 상근이의 설탕 배달 문제 이다
혹시라도 이 글을 보는 사람들이 있다면, 주말에 여유시간 날 때 도전해 보는게 좋겠다
(사실, 내가 못 해서 그런거지 지금 생각해 보면 참 천사같은, 친절하고 쉬운 문제다)
* 링크(클릭)를 드릴테니, 궁금한 분들은 풀어보시길
다시 이야기로 돌아와보자
난 이 문제에서 턱 막혀버렸고, 이걸 뭐 어떻게 해야 하는지는 감이 도저히 안 왔으나
'이 문제를 최대한 내 힘으로 꼭 풀어보겠어' 라는 생각만큼은 굳건했었다
구글링을 해 보면 해당 알고리즘에 대한 결과는 크게 두 부류였다
1. 깔끔하게 정답 코드를 탁 적어놓고 이렇게 풀었다고 설명하는 사람들(대부분) 과
2. 혹여나 나같이 어떻게든, 최대한 혼자 힘으로 풀어내고자 하는 욕심을 가질 사람이 있을까봐, 단계적으로 스무고개 하듯 힌트를 늘려주면서 문제를 해설한 사람(일부)
난 그 일부의 마인드에 감동을 받았고, 앞으로 먼 훗날(일까...?)
회사 코딩 테스트에 사용되는 알고리즘들에 본격적으로 도전하는 경우에 알고리즘 해설을 쓸 때도
2번 처럼, 문제를 최대한 혼자 힘으로 풀기 위해 노력하는 사람들을 고려하여
한 번에 두괄식으로 공개하는 게 아닌 단계별로 힌트를 주는 그런 사람이 되고 싶다
이 글을 보고 난 뒤
'아니 그래서, 니가 오늘 공부한 건 어딨는데, 문제랑 해설 간단히라도 써봐' 라고 하는 사람들도 당연히 있을거다
하지만 문제는 쓸 수 없다, 앞서 말 했듯, 코드스테이츠 측에서 직접 개발한 문제이기 때문에
그래서 고민끝에 문제는 간단히 쓰지 못 하지만,
내가 문제를 풀고, 정리한 과정들을 적어보려고 한다
낚시로 치면 배스 낚시, 메기 낚시, 잉어 낚시에 대한 각각의 포스팅을 적는 것보다
낚시를 하기 위한 공통적인 방법론이 되겠다
여담이 길었으니, 이제 시작해보자!
일단 어제부터 오늘 15시 경까지 알고리즘 문제 18개를 전부 풀었다
오늘 18시 까지 일단은 푸는 것이었는데, 15시 경까지 풀었기에 나름 괜찮은 성과라고 보고싶다
(상대방들은 아마... 금방 다 풀었을 거 같지만)
그리고 이번 단원에서, 나와 pair 의 계획은 이거였다
1. 30분 이상 생각하고 코드를 쳐 봐도, 전혀 진전이 없다 싶은 문제는 패스 후 과감히 다음으로 넘어가자 :
그 곳에서 에너지가 빨리면 다음 문제들에도 투입할 수 있는 에너지가 적어지고, 그나마 풀면 다행이지만 풀지 못 하면 거기에 이제 상실감까지 더해질 것이다. 그리고, 사람은 투입할 수 있는 자원의 제한이 있어야 tight 한 마인드를 가지고 공격적으로 접근하게 된다는 점도 고려해보자.
2. 그렇게 빠르게 한 바퀴를 돌고 난 뒤, 조금은 편해진 마음과 말랑해진 머리로 다시 못 푼 문제에 접근하자 :
이번엔 1번처럼 하는 것이 아닌, 필사적인 접근이다. 최대한 우리가 모르는 부분을 알아가는, 적어도 '뭘 모르는지는 알자' 부터 시작해서, '뭘 모르는지를 알아보니 이거더라' 라는 인지, '이 개념은 console 에 찍어보니 이런 식으로 활용할 수 있더라' 하는 체득, 그리고 이 일련의 과정들을 꾸준히 문제에 적용해보는 식으로 문제를 해결해 보자
3. 문제를 다 풀면, 다시 푼다 :
다시 푸는데, 이번엔 운영진이 적은 모범 답안, 혹은 다른 사람들의 답안을 보면서, 사고의 boundary 를 확장한다. '다른 개념을 통해 이렇게도 사용할 수 있구나', '같은 개념을 사용해도, 이렇게 하면 더 깔끔한 코드를 사용할 수 있구나' 라는 식으로 생각을 하고 메모한다. 문제는 아는 개념을 확인하고, 다른 사람들의 풀이를 보면서 배우려는 거지, 맞추려고 푸는 게 아니다.
이렇게 접근해 나간 기록들, 그 중에서도 안 풀리는 문제들을 위주로 접근해 나가는 기록을 위주로 공유하는 것으로 이번 포스팅을 꾸리고자 한다
[ 잘 안 풀리는 문제에 맞닥뜨렸을 경우 ]
1. 일단은 psuedo code 를 작성해 본다
문제 :
강아지에게는 밥, 고양이에게는 물을 주어야 한다
그러나 수컷 강아지의 경우 밥 중에서도 사료를 주지만, 암컷 강아지의 경우 밥 중에서도 먹다 남은 고기를 주고
고양이의 경우 수컷 고양이의 경우 물이 아닌 탄산수를 주는 반면, 암것 코양이의 경우 그냥 물을 준다
이를 코드로 작성하라
///////////////////////////////////////
대략적인 로직 :
- 강아지인지, 고양이인지를 판별한다
- 강아지와 고양이의 성별을 알아야 한다
- 동물의 종류와 암/수에 따라 다른 것들을 준다
///////////////////////////////////////
psuedo code 의 장점은 토론에서의 brain storming 이나, 초면인 사람들이 모이는 자리에서의 ice breaking 과도 같다
하나하나 해 나가는 것이다
'정답을 바로바로 코드로 작성해야 해!' 라는 생각을 은연중에 깔지 말고
이런 식으로 natural language 로 작성해도 되니, '어떻게 하면 좋을까' 가 고민으로 드러날 수 있게 적어주면 좋을 거 같다
그림을 통한 도식화도 좋은 선택지가 될 수 있다
나같은 경우는 검사를 해 본 결과 공간지각력이 매우 부족한 편이기에
배열 속의 배열 속의 배열 속의 배열을 다루는 과정과 같은 것들은
이런 식으로 내가 그나마 잘 알아들을 수 있는 문자를 통해 작성하는 편이다
2. 조건이 복잡하면, 조건을 쪼갠다. 다양한 case 로 복잡하게 엮여있는 문제이면, 간단하게 나눠본다
복잡한 조건은 한 번에 풀려고 하면 더 꼬인다
차라리, 그냥 복잡한 조건을 내가 보기 편하게 나만의 방법으로 정리하고
그 조건에 따라 조건을 나눈 뒤 각 조건의 해결을 우선 해 보는게 낫다
3. 애매하다 싶으면 콘솔이랑 터미널을 적극 활용하라
'이게 될까?' 라고 생각한 경우 고민에서 그치지 말고 함수를 만들어 콘솔이나 터미널에 바로 찍어보자
컴퓨터 공학에서 애매한 건 없다. 우리가 애매하게 만들었거나, 우리가 그것을 애매하게 이해할 뿐이라고 생각한다
상기한 이런 과정으로 문제를 풀어나갔던 거 같다
나는 30분 동안 이 과정들을 진행해 보았다
그리고, 30분을 투자했는데 진척이 유의미한 수준이 아니라면 넘어간다
하지만, 30분을 투자했고, '이것만 하면 될 거 같은데!' 의 경우는
딱 10분, 10분정도만 더 해본다
그렇게 해도 안 되면, 그냥 다음 문제로 미련없이 넘어간다
(사실 내가 이번 알고리즘 문제를 풀며 감정 과잉 상태였던지라... pair님에게 솔직한 의견을 들어보고 싶다)
이렇게 해서 문제를 다 풀면 이제 다시 풀어보는 시간을 가진다
이번의 경우 다른 사람들의 풀이를 잘 확인하지 못 했던지라
code states 측에서 솔루션으로 제시해 준 풀이를 위주로 참고했으며
그 풀이를 보면서 떠오르는 점들을 전부 메모하였다
뭐 그리고 나서 이제 다시 풀어볼까! 했는데
일정 상 office hour 가 다 되어서... 페어분과는 'pair'well 하고 난 뒤
office hour 에 참석하여 이번 문제의 해설 담당을 맡은 분의 이야기를 또 들어보았다
여튼, 오늘은 그렇게 하루를 보냈다
근 이틀동안은 따로 공부한 것이 없고, 이해가 안 되는 부분들(recursion, functional programming) 이 많이 남아있던지라
이번 주말까지의 시간들을 활용해 내가 공부하기로 했던 부분에 시간 투입을 해봐야겠다
10일차 개발일지, 끝!