프리코스 최종 코딩 테스트 - 점심 메뉴 추천
Last updated
Last updated
12월 14일 수요일 1차 합격자 발표와 함께 17일 잠실 캠퍼스에서 이루어진 최종 코딩 테스트에 대한 간단한 소개와 소감을 작성한다.
14일 수요일은 우테코 1차 합격자 발표날이다. 시간은 3시이고 모든 참가자에게 메일로 합격과 불합격의 여부를 알려준다. 발표날의 몇 주 전 부터 14일만 생각하면 가슴이 떨려왔다. 당일이 되니 떨리는 가슴은 더욱 요동치기 시작했다.
14일도 어김없이 출근을 하였다. 하지만 이날 만큼은 조퇴를 한 후 물리치료를 받으며 경건한 마음으로 이메일을 기다렸다. 3시가 되는 순간 네이버 메일함을 새로고침을 하였고 3시 1분이 되는 순간 우테코에서 하나의 메일이 발송되었다.
빨리 결과를 보고 싶어 1초의 고민도 없이 바로 이메일을 클릭하였다. 다행히 1차 결과는 합격이었다. 때문에 3일 뒤에 있는 오프라인 코딩 테스트에 참가해야 했다.
짧게나마 프리코스가 끝난 후 합격자 발표까지 3주간의 시간동안 무엇을 했는지 남긴다. 프리코스는 알다싶이 4주간 진행이 되었고 각 주마다 하나의 미션이 주어졌다. 그 중 1주차엔 7가지의 문제를 푸는 미션이었고 나머지 주차엔 하나의 작은 애플리케이션을 만드는 것이었다. 일단 1주차 미션을 제외한 나머지 미션에 대해 다시 한 번더 코드를 작성하고 피어 리뷰를 통해 다른 사람들에게 많은 코드 조언을 들으며 내 코드의 품질을 높힐 수 있도록 노력하였다. 스터디에 참가하여 게더타운에 만나서 자신의 코드를 발표하기도 하고 질문을 하면서 다양한 코드를 보기도 하였다. 스터디원들은 오프라인에서 서로 만나 스터디를 하기도 하였는데, 나는 타지역이기도 하고 평일에 출근을 해야 해서 함께하지 못했다. 이 점은 아쉬웠으나 게더타운에서 만나 함께 코딩을 하는 것 만으로도 큰 도움이 되었다.
또 다른 스터디도 하였는데, 준보쌤, 설탕쌤과 함께 '객체지향의 오해와 사실'이라는 책을 읽고 프리코스의 과제에 대한 구조를 짜는 스터이였다. 아직 책은 모두 읽지 못하였지만 단순히 프리코스를 위해 읽는 것이 아닌 앞으로 코드를 계속 작성하는 나의 입장에서 큰 도움이 되는 책이라고 생각한다. 곱씹어 생각할 것도 많고 지금까지 코드를 난잡하게 작성하고 있는 나의 모습을 반성도 하고 있다. 여러번 읽어야 겠다.
오전에 간단히 아점을 먹고 잠실 루터회관으로 출발하였다. 집에서는 그리 멀지 않은 곳이지만 일찍 도착하고 싶은 마음에 11시에 출발하였다. 버스를 타고 송파역에서 내려 잠실역까지 지하철을 타고 이동했다. 루터회관은 잠실역 7번 출구였나? 그 쪽 출구가 가깝지만 난 로또를 사기 위해 8번 출구로 올라왔다. 여전히 잠실역 8번 출구 앞 로또집은 줄이 길었다. 10분 가량 줄을 기다리고 로또를 구매한 뒤 루터회관 앞 스타벅스에 들어섰다.
루터회관 앞 스타벅스에 들어서니 노트북을 가지고 열심히 코딩을 하고 있는 분들이 많이 보였다. 모두 우테코 최종 코딩 테스트에 참여하는 분들로 보였다. 자리도 없고 곧 입장 시간인 12시가 되어가서 난 테이크아웃을 하고 루터회관 14층으로 향했다.
루터회관 14층, 5분 일찍 도착을 하여 잠깐의 대기 시간을 가졌다. 나 말고 미리 도착한 분들이 5명 정도 계셨고 문 안에는 우리를 맞이할 준비를 하고 계시는 코치분들이 보였다.
12시가 되자 문이 열리고 코치분들이 나오셔서 환영을 해주셨다. 참가자들은 줄을 선 후 차례대로 출석체크를 하였고 출석체크와 함께 기념품도 받았다. 기념품은 볼펜 2자루와 작은 노트 한 권이었다.
우테코 교육기관에 들어서면서 가장 먼저 맞이한 공간은 유튜브에서 자주 봤던 라운지였다. 많은 식물과 함께 예쁜 테이블이 잘 어울러져 있는 곳이다. 반드시 합격을 해서 이곳에서 코딩을 하고 싶다는 생각이 들었다.
최종 코딩테스트 시간은 5시간으로 짧지 않는 시간이다. 그렇기 때문에 중간중간 스트레칭도 하고 화장실도 가야한다. 이러한 이유로 앞자리 보다는 이동이 수월한 뒷자리가 좋다는 판단을 하면 맨 뒷자리에 앉게 되었다. 또한 맨 뒷자리를 제외한 자리들은 다른 사람들과 함께 긴 책상을 같이 사용하지만 맨 뒷자리는 혼자만 사용할 수 있어 부담감이 덜했다.
최종 코딩테스트는 1시에 시작된다. 컴퓨터 세팅을 마치고 충전기를 연결한 후 와이파이를 연결하였다. 그러고도 시간이 많이 남아 이전에 진행했던 미션들을 다시 보며 긴장감을 낮추기 위해 노력했다. 그리고 다른 참가자들의 모습도 보며 최대한 이 시간을 즐기고자 다짐하였다.
1시가 되었다. 최종 코딩테스트 안내 메일은 이미 12시에 도착했고 미션이 담긴 레포는 1시에 열렸다. 주제는 코치들의 평일에 먹을 메뉴를 정하는 것이었다. 기능목록을 작성하는 것을 시작으로 최종 코딩테스트를 풀기 시작했다.
최종 코딩테스트의 미션은 코치들의 점심 메누를 추천하는 것이다. 월요일 부터 금요일까지 여러 카테고리의 매뉴를 특정한 기준에 따라 추천을 하면 된다.
카테고리는 총 5개이며 일식, 한식, 중식, 아시안, 양식이 그것이다. 각각의 카테고리에는 9개의 메뉴가 있으며 이 중 코치들이 먹지 못하는 메뉴를 정하여 해당 메뉴가 추천되었을 때 다시 다른 메뉴를 추천을 해야 한다. 또한 5일 동안 같은 카테고리는 최대 2회까지 고를 수 있는 것도 고려해야 한다.
우아한 테크코스 최종 코딩테스트 점심 메뉴 추천 저장소
기능 목록은 너무 자세하게 작성하지 않도록 하였다. 실제 코드를 구현을 하면서 수정할 것이 생길 수 있기 때문이다. 최대한 점심 메뉴의 흐름을 잡을 수 있도록 기능 목록을 작성하였고 코드를 작성하면서 필요한 기능 목록을 수시로 추가하였다. 기능 목록 작성에 소요된 시간은 20분 정도였던 것으로 기억한다.
아쉬운 점은 리펙터링과 테스트 코드 작성에 대한 기능 목록을 작성하지 못했다는 것이다. 이는 시간이 부족하여 리펙터링과 테스트 코드를 작성하지 못하였기 때문이다. 왜 시간이 부족하였는지는 아래에서 확인할 수 있다.
기능 구현은 어렵지 않게 끝냈다. 4기의 최종 코딩테스트인 페어 매칭 보다 난이도가 낮아 오랫동안 고민한 것은 없었다. 물론 그렇다고 내가 작성한 코드가 좋은 코드라고는 생각하지 않는다.
기능을 구현하면서 이대로의 속도라면 리펙터링과 테스트 코드 작성까지 완성할 수 있을 것이라는 생각을 가졌다. 때문에 여유로운 마음을 가지며 코드를 작성하였다. 모든 기능이 완성이 되었고 직접 터미널로 애플리케이션을 돌려 모든 기능이 정상적으로 돌아가는 것을 확인 한 후 테스트를 진행하였는데, 이럴수가... 오류가 발생하여 테스트를 통과하지 못하는 것이었다.
테스트 코드가 실패하는 것을 알았을 땐 대략 3시 30분 정도였다. 아직 2시간이 넘는 시간이 있기 때문에 큰 부담감과 긴장감은 가지지 않았으나 빨리 해결하고 싶은 마음은 가득했다.
그렇게 무엇이 잘못인지 파악을 하던 중 우테코에서 제공하는 @woowacourse/mission-utils
라이브러리의 Random.shuffle
메서드에 오류가 있음을 알게 되었다.
먼저 Random.shuffle
메서드가 어떻게 동작하는지 살펴보자. 해당 메서드는 요소가 숫자인 배열을 인자로 받는다. 그 후 인자의 요소를 무작위로 섞어 새로운 배열을 반환한다. 즉, 배열의 요소를 무작위하게 섞이는 것이다.
이렇게 섞인 배열의 첫 번째 요소가 바로 코치가 먹을 메뉴의 번호가 된다. 즉, 각각의 카테고리의 메뉴의 개수는 총 9개이다. 이를 배열로 나타내면 배열의 인덱스는 0부터 8까지의 숫자이고 이를 Random.shuffle
메서드를 통해 무작위로 섞은 후 첫 번째 요소(인덱스)에 해당하는 메뉴를 선택하면 된다.
하지만, 계속해서 오류가 발생하였다. 오류 메시지를 꼼꼼히 읽어 보며 무엇이 문제인지 생각하였다. 0이 계속 정의되지 않음이 나타났다. 또한 테스트 코드를 보면 메뉴의 번호에 9
가 있었다. 이는 메뉴의 순서가 인덱스 번호가 아니라 인덱스 번호에 1을 더한 숫자라는 뜻이다. 그렇게 메뉴들의 인덱스에 1을 더한 요소를 가지는 배열을 만들었고 이를 가지고 Random.shuffle
메서드를 돌려 무작위 숫자를 추출하였다. 이후 추출한 숫자에서 1을 뺀 값을 인덱스로 가지는 메뉴를 뽑아냈다.
이렇게 하나의 오류를 해결하니 다른 오류가 발생하였다.
미션 레포에는 아래와 같은 기능 요구 사항이 적혀있다.
메뉴를 추천하는 과정은 아래와 같이 이뤄진다.
월요일에 추천할 카테고리를 무작위로 정한다.
각 코치가 월요일에 먹을 메뉴를 추천한다.
화, 수, 목, 금요일에 대해 i, ii 과정을 반복한다.
이를 해석하면 특정 요일에 추천할 카테고리를 정한 후 코치들에게 해당 카테고리의 메뉴를 추천한다. 이를 5번 반복하면 되는 것이다. 즉 기준이 되는 것이 요일이라고 할 수 있다. 다시 말해 한 요일의 메뉴를 모두 고른 후 다른 요일로 넘어가야 함을 의미한다.
처음에 이를 바탕으로 코드를 작성하였다. 먼저 월요일에 추천할 카테고리를 정한 후 해당 카테고리에 해당하는 메뉴들 중 하나를 코치들에게 추천하였다. 여기서 만약 코치가 먹지 못하는 메뉴이거나 이미 추천 메뉴에 포함되어 있으면 다시 메뉴를 랜덤으로 뽑아 코치가 먹을 수 있는 메뉴가 추천될 때 까지 반복한다. 그 후 화요일로 넘어가 위의 과정을 반복하였다.
위의 과정은 미션 레포에 적혀있는 기능 요구 사항에 부합되는 과정이다. 하지만 번번히 테스트 코드에서는 실패를 하였다. 테스트 코드에서 예상되는 코치들의 메뉴와 내가 작성한 코드에서 추천하는 메뉴가 달랐던 것이다. 이를 해결하기 위해 거의 1시간 이상의 시간을 사용했었다. 정말 이때가 흔히 말하는 똥줄타는 시간이었다. 그 이유는 미션 레포의 프로그래밍 요구 사항에 아래와 같은 메시지가 있었기 때문이다.
프로그램 구현이 완료되면 ApplicationTest의 모든 테스트가 성공해야 한다. 테스트가 실패할 경우 0점 처리한다.
너무 무시무시한 요구 사항이기 때문에 이를 해결하고 싶어 안달이 났다. 결론부터 말하자면 어디서 오류가 발생했는지를 미션 종료 30~40분전에 알게 되어 이를 부랴부랴 해결하고 테스트까지 성공적으로 마무리하였다. 그럼 지금부터 무엇이 문제였는지 살펴보자.
나는 무엇이 문제였는지 파악하기 위해 테스트 코드를 뚫어져라 쳐다봤다. 정말 적어도 30분 이상을 가만히 앉아서 테스트 코드가 봤던 것 같다. 아래는 내가 실패한 이유가 담겨 있는 테스트 코드이다.
무엇이 문제인지 보이는가? 정답은 한 코치의 메뉴를 모두 정한 후 다른 코치의 메뉴 선정으로 넘어가는 것이 문제였다. 이는 미션 레포에 적혀있는 기능 요구 사항과는 달랐기 때문에 발견하기 더 어려웠던 것 같다.
오류의 원인을 발견하고 난 후, 미션 종료 시간까지 많이 남아있지 않았기 때문에 얼른 코드를 수정하기 시작했다. 다행히 미션이 종료되기 전 테스트를 통과할 수 있었고 약간의 리펙터링을 진행할 수 있었다. 하지만 추가적인 리펙터링과 테스트 코드를 작성하지 못해 아쉬운 점이 남았다.
아래는 해당 오류를 수정하기 위해 작업한 내용이 담긴 커밋이다.
제한된 시간동안 이루어지는 코딩테스트였기 때문에 마지막 1시간은 정말 심장이 쫄깃하였다. 마감 시간이 거의 도달할 때 쯤, 아직 테스트가 통과되지 못해 심장이 요동쳤고 안절부절하지 못했었다. 기능을 구현할 때 조금더 타이트하게 했어야 하나? 라는 의문점이 들었다.
또한 기능 요구 사항과 테스트 코드의 내용이 다르기 때문에 이를 우테코에선 어떻게 해결할지 궁금하였다. 어쨌든! 테스트 코드의 오류 때문에 많은 시간을 보냈지만 결과적으론 통과를 했다. 일단 이것에 의의를 두고 지내고 있다. 추후 커뮤니티를 통해 알게된 점은 프론트앤드 참가자 103명 중 테스트 코드를 통과한 사람은 40명 정도라는 것이다. 이는 백앤드와 안드로이드에 비하면 현저히 낮은 통과률이다.
다른 코스에 비해 낮은 통과률을 기록한 까닭을 나름 생각해보면 Random.shuffle
메서드의 사용과 기능 목록과 다른 테스트 코드인 듯 하다. 얼마나 빨리 무엇이 잘못되었는지 정확히 판단하는 것이 이번 최종 코딩 테스트의 관건으로 느껴졌다.
우아한테크코스 지원하기 플렛폼에 나의 PR를 제출하고 소감문을 간단하게 작성을 하였다. 그리고 예제 테스트를 실행하면서 12월 17일에 이루어진 우아한테크코스 5기 최종 코딩 테스트가 마무리 되었다.
6시가 되기 5분 전 짐을 싸고 우테코 코치인 준님에게 인사를 건낸 후 1층 로비로 향했다.
우테코를 지원하게 되면서 작은 소원이 생겼다. 그것은 바로 준보쌤과 설탕쌤과 함께 최종 코딩 테스트를 치룬 후 뒷풀이를 하는 것이다. 운 좋게 모두 최종 코딩 테스트를 볼 수 있는 자격이 주어지고 같은 캠퍼스에서 테스트를 치루게 되어서 뒷풀이를 할 수 있었다.
시간을 거슬러 올라가 10월 중순, 이직에 뜻이 있는 준보쌤, 설탕쌤과 함께 우테코에 지원하기로 다짐을 하였다. 함께 준비하면서 많은 힘이 되었다. 특히 자소서에 대한 좋은 피드백을 받아 보다 완성도 높은 자소서를 쓸 수 있었던 것이 나에게 큰 행운이었다. 또한 프리코스를 하는 동안 서로 응원을 하였기에 많은 힘을 얻을 수 있었다.
모두 최종 코딩 테스트를 한 만큼 내년에 함께 우테코에 참여하여 서로에게 좋은 영향을 미치며 성장을 하였으면 좋겠다.
참고로 뒷풀이는 근처 치킨집에서 이루어졌다. 우테코 이야기, 최종 코딩 테스트 이야기, 학교 이야기 등 많은 이야기를 나누며 즐거운 시간을 보냈다. 모두 원하는 바를 이루었으면!
벌써 최종 발표날이 3일 남았다. 현재는 12월 25일이다. 그렇다 크리스마스이다. 우테코 최종 합격이라는 메일이 늦은 크리스마스 선물이 되었으면 한다. 벌써부터 떨리지만 좋은 결과가 있기를 바라며 최종 코딩 테스트에 대한 회고를 마무리 한다.
📅 2022-12-25