본문 바로가기

code-states

[code-states][we-win] 10일차 - algorithm, algorithm, and algorithm!

어제와 오늘은(특히 오늘은) 여태껏 배웠던 내용들을 전부 다 활용하여

운영진들이 우리가 여태껏 학습해 온 기본 개념을 활용해 풀 수 있도록

직접 만든 문제들을 풀어내는 알고리즘 시간이었다

그리고 나는 오늘 어제 적은 것(클릭) 처럼 알고리즘을 정리하려 했는데

일단은 두 가지 이유로 다 적진 못하고 간략하게만 적을 거 같다

첫째론, 이 문제는 프로그래머스나 백준과 같은 공용의 문제가 아니라, 저작권이 있는 문제라 모든 코드와 문제를 노출하기 어렵다

둘째론, 이 글을 볼 누군가에게 '정답과 해설' 이라기보단, '어떤 개념을 어떻게 썼다' 라고, 최대한 본인 주도적으로 문제 해결을 위해 미약하게나마 주는 힌트로서만 도움이 되고 싶었다

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일차 개발일지, 끝!