티스토리 뷰
컬리지 강의가 끝난지 두 달이 되었고,
당시 제 학생들은 모두 졸업반이었던지라
이미 졸업을 하고서 취직을 했거나 혹은 구직 중인 상태예요.
오늘 당시 제 학생들 중 한 명에게 메세지가 왔어요.
"도움이 필요해요.
10000개의 정수가 랜덤한 순서로 들어있는 리스트를 만들건데,
1과 10000을 포함해서 중복되는 숫자가 없도록 만들어서 그 리스트를 출력해야해요.
'작동하는 코드를 만들 것'이 최소 요구조건이고,
제가 만들 수 있는 가능한 가장 효율적인 코드, 혹은 제 능력으로 만들 수 있는 가장 짧은 코드를 작성하래요.
얼마나 간결하고 깔끔한 로직을 담은 코드를 짤 수 있는지 그 능력을 평가하는 과정이라고 하는데,
이 문제에 대해 도움을 좀 주세요...."
사실 학생에게서 이 메세지를 받았을 때 가장 먼저 든 생각이 있지만, 블로그에는 적지 않을게요.
문제를 기술해놓은 말투를 통해 어떤 상황인지 바로 눈치채긴 했지만, 결과적으로 저는 이 학생을 도와주었어요.
(저도 초보인 주제에!! ㅎㅎㅎㅎ)
어떤 마음으로 도와주었냐면,
"나는 컬리지의 정규 강사가 아닌, 앱개발 강의 하나만 맡은 외부 강사였는데,
나에게 이렇게 연락을 주었다는 것은 그래도 내 수업에 대해 긍정적인 마음을 갖고있기 때문에 내게 물은거겠지??"
라는 기분좋음과,
"그래도 내가 가르쳤던 학생인데, 도움이 필요하다고 내게 요청하는 상황에 무조건 그냥 외면할 수는 없지"
라는 생각으로요.
단, 조건을 걸었어요.
네가 짠 코드를 내게 먼저 보내봐.
네가 네 코드를 먼저 오픈한다면, 나도 내가 짠 코드를 공유해줄게.
그리고 학생이 답장이 없는 동안
학생의 답장을 기다리면서 파이썬으로 코드를 짰어요.
총 4줄의 코드가 나왔어요.
사실 제가 컬리지에서 가르친 언어가 코틀린이었던지라,
이 학생이 제게 질문을 했을 때 당연히 코틀린으로 작성한 코드를 보낼 줄 알았는데,
시간이 좀 지나서 "여기 제 코드예요" 하고 학생이 제게 보낸 코드는 자바스크립트 코드였어요.... 롸..?!
그것도 총 34줄의 자바스크립트 코드요....
@_@
코틀린 수업을 했던 강사에게 보내는 코드를 자바스크립트로 짰을 줄이야....
일단 네가 자바스크립트로 보냈으니.. 뭐 나도 자바스크립트 코드를 조금 아니까 나도 자바스크립트로 짜주마.. 하고
처음 짰던 파이썬 코드 내용을 그대로 자바스크립트 문법으로 바꿔적었어요.
4줄이던 파이썬코드가 오히려 두 줄이 줄어들어서 자바스크립트로는 2줄이 됨!! ㅎㅎ
이 학생의 코드를 읽어보니
1부터 10000까지의 정수 중 랜덤한 숫자 하나를 만드는 코드를 쓴 다음,
그 숫자가 "나의 리스트"에 들어있는지를 확인하고,
이미 리스트 안에 존재하는 숫자면 그 숫자를 버리고서 다시 돌아가서 새로운 랜덤한 숫자를 생성해요.
아직 그 리스트에 존재하지 않는 숫자면 리스트의 맨 끝에다 그 숫자를 추가해요.
그러면 한번 만들었던 숫자가 또 나오고, 그 숫자를 가지고 리스트 안에 들어있는 숫자와 하나하나 대조해보고
그러다보면 언젠가 나중에 9999개의 숫자가 리스트에 들어있고 단 하나의 마지막 숫자만 남아있을 땐,
이 마지막 숫자를 얻으려면 랜덤한 숫자를 계속 힘겹게 생성하다가 아주 운이 좋게, 그리고 우연히 그 숫자가 나와야겠죠.
예를 들어 마지막으로 우리가 필요한 숫자가 8327이라고 하면,
랜덤하게 492란 숫자를 만들어서 이걸 들고 리스트 안의 숫자들과 비교해보러 가요.
그 안에 8327을 제외한 9999개의 숫자가 들어있는데 그걸 일일이 비교해보고, 앗 492는 이미 있잖아?? 하고 돌아와요.
또 랜덤하게 숫자를 하나 만들어서 3091라는 숫자가 생기면 이걸 들고 또 9999개의 숫자가 들어있는 리스트로 가서....
또 랜덤하게 925, 또 랜덤하게 8, 또 랜덤하게 2056.... 운좋게 8327이 나올 때까지....
마지막 숫자 하나를 성공적으로 얻어낼 확률이 무려 1/10000 임.
9999개의 숫자를 겨우겨우 어떻게 운 좋게 얻은 뒤에도
맨 마지막 숫자를 얻으려면 확률적으로 1만번 생성해서 한 번 매칭이 되니까요.
코드가 원하는 결과물을 얻어낼 지언정, 굉장히 비효율적인 코드가 됐어요.
문제에서 물어본 것은
- 1부터 10000까지 번호가 겹치지 않는 1만개의 정수를 리스트에 담을 것
- 리스트 안의 그 순서가 랜덤할 것
이렇게 단 두 개인데요.
그러니 랜덤한 숫자를 만든 다음 그 숫자가 아직 한번도 만들어진 적이 없는 숫자인지 비교해보고 리스트에 하나씩 넣기보다는,
먼저 1만개의 숫자를 순서대로 리스트에 만들어넣은 다음, 그걸 섞어버리면 되는 거 아니겠음..
1, 2, 3, 4, .... 9999, 10000 이렇게 리스트를 만들면 당연히 겹치는 수가 없죠. 1씩 증가하는 숫자들이니까요.
그리고 그걸 셔플해버리면 문제에서 물어보는 조건이 모두 만족되는 게 아닌가 하고요.
그래서
1번째 줄: 1부터 10000까지의 숫자를 차례대로 담은 리스트 생성한 직후에 그 리스트를 랜덤하게 섞는 코드
2번째 줄: 윗줄에서 만든 그 리스트를 출력하는 코드
이렇게 두 줄이면 완성되는 코드예요.
리스트를 셔플하기 위해서 파이썬에서는
import random으로 랜덤 모듈을 수입(?)한 다음,
random.shuffle(리스트이름) 을 통해 섞어버리면 쉬운데,
자바스크립트는 sort()안에 비교함수를 넣어서 랜덤하게 순서를 재배치해야했어요.
하지만 학생은 리스트를 셔플하는 비교함수 부분의 코드가 이해가 되지 않는다고 했어요 ㅜㅜ
코틀린 강의에서 가르쳤던 학생에게 자바스크립트 코드를 설명해주고 있으니 뭔가 낯설고 이상한 기분이 들긴 하지만,
그래도 이렇게 도움을 요청하는 것도 굉장히 큰 용기가 필요하다고 생각해요!!!!
(제가 도움을 잘 요청하지 못하고 쭈뼛쭈뼛하는 타입인지라.... 도움을 요청하는 분들이 더 멋지고 굉장해보여요)
그래서 비록 메신저로 설명을 해줘야하는 한계가 있지만, 최대한 자세하게 잘 설명을 해주었어요.
그리고 저 역시도 비교함수가 정확히 어떤 순서로 작동되는지 원리를 모르고 그냥 코드를 쓰는 법만 알고서 사용하고 있었는데,
최근에 제가 compsci 코스에서 sorting 알고리즘 공부를 하면서 배웠던 내용이 적용되는 거였어요!!
학생을 도우면서 저도 새로운 공부를 하게 되었으니 제게도 좋은 기회였던거죠 :)
요즘 정말 스스로가 기특한 나날이야 헷-