[우아한테크코스 5기 _ 프리코스 FE] 최종코딩테스트 후기 /점심메뉴추천
작성일 2023년 2월 13일
열심히 소감문을 작성한 덕분인지 최종코딩테스트 합격 메일이 왔다. 알바하고 있었는데 기분 째졌음
우테코에서 메일이 항상 수요일 3시인가 왔는데 알바 끝날 때 시간이라 콩닥콩닥하면서 메일 확인했었음. 암튼 안붙었다면 블로그 시작을 안했겠지? 쿠쿠루..
🫧문제 및 코드 보기🫧
GitHub - hafnium1923/javascript-menu
Contribute to hafnium1923/javascript-menu development by creating an account on GitHub.
github.com
최종 합격 후기
뭐,, 어쨌든 붙었으니 있어보이는 척 몇 마디 써보겠어요~ 누군가가 이걸 읽고있다면 정보찾는거니까 도움은 되겠죠?
- 기본 문법과 사용예시 외 서치 최대한 지양하는게 도움이 되었다. 다른 교육생들의 생각이 궁금하지만 애초에 프리코스 진행하면서 해당주차 미션에 대한 질문이 불가능하니 혼자 생각해서 풀어보자!
- 소감문은 본인의 경험을 작성하며 다시한번 깨닫는 시간이다. 따라서 막혔던 부분과 해결방안에 대해서 잘 생각 후 작성하자 > 소감문이 곧 회고록이라 따로 작성할 필요는 없었다
- 지난주차 막혔던 부분은 이번주차에 막히지 않도록 공부하자.(너무 당연한 말이긴 함)
- 나 같은 경우 최종코딩테스트 시간이 남았다.
- 1시부터 6시까지 진행이었는데 다풀고보니 한두시간 시간이 남아서 멍때리고 있었다. 괜히 인터넷 하다가 커닝으로 의심받을까봐 이면지에 그림그리면서 놀았던듯? 그래도 시간안가서 걍 라운지에 앉아서 멍때렸다.. 제출시간 되자마자 제출하고 다시 라운지에서 멍때리고 있으니까 다풀었으면 집에 가래서 슝하고 나옴.
- 그만큼 문제자체는 어렵지 않았다.
- 다만 문제가 여러방면으로 해석될 여지가 있어서 길을 한번 잘못 잡으면 헛발질하게 만드는 종류였던 것 같다.
- 나는 문제읽고 readme 작성하기 전에 test도 읽은 후에 개발 방향을 잡았다. 이렇게 했던것이 삽질 안한 가장 큰 이유가 아니였을까?
- 아 프론트엔드는 상대적으로 테스트 통과자가 적었다. 그래서그런지 코테는 fail떴지만 최종합격한사람도 있다고 함 (백엔드는 통과한 인원이 많아서 그런지 문제 풀었어도 떨어진 사람 많다고 하더라..)
- 암튼 프리코스기간동안 소감문 작성하는것이랑 발전하는 모습을 보여주는 것이 가장 중요한듯? 우아한테크코스는 완성된 개발자를 뽑는 것이 아니라 원석을 뽑아서 다듬는 과정이니까..
README
<테스트 관련 확인사항>
- async/await 구문을 사용하지 않아야 한다. ✔️
- 파일 이름의 대소문자를 엄격히 체크해야 한다. ✔️
<프로그래밍 동작>
- 코치들은 월, 화, 수, 목, 금요일에 점심 식사를 같이 한다.
- 메뉴를 추천하는 과정은 아래와 같이 이뤄진다.
- 월요일에 추천할 카테고리를 무작위로 정한다.
- 각 코치가 월요일에 먹을 메뉴를 추천한다.
- 화, 수, 목, 금요일에 대해 i, ii 과정을 반복한다.
- 코치의 이름은 최소 2글자, 최대 4글자이다.
- 코치는 최소 2명, 최대 5명까지 식사를 함께 한다.
- 각 코치는 최소 0개, 최대 2개의 못 먹는 메뉴가 있다. (, 로 구분해서 입력한다.)
- 먹지 못하는 메뉴가 없으면 빈 값을 입력한다.
- 추천을 못하는 경우는 발생하지 않으니 고려하지 않아도 된다.
- 한 주에 같은 카테고리는 최대 2회까지만 고를 수 있다.
- 각 코치에게 한 주에 중복되지 않는 메뉴를 추천해야 한다.
예시)
구구: 비빔밥, 김치찌개, 쌈밥, 규동, 우동 → 한식을 3회 먹으므로 불가능
토미: 비빔밥, 비빔밥, 규동, 우동, 볶음면 → 한 코치가 같은 메뉴를 먹으므로 불가능
제임스: 비빔밥, 김치찌개, 스시, 가츠동, 짜장면 → 매일 다른 메뉴를 먹으므로 가능
포코: 비빔밥, 김치찌개, 스시, 가츠동, 짜장면 → 제임스와 메뉴가 같지만, 포코는 매번 다른 메뉴를 먹으므로 가능 - 메뉴 추천을 완료하면 프로그램이 종료된다.
- 사용자가 잘못된 값을 입력한 경우 throw문을 사용해 예외를 발생시키고, "[ERROR]"로 시작하는 에러 메시지를 출력 후 그 부분부터 입력을 다시 받는다.
(입력)
- 메뉴 추천을 받을 코치의 이름을 입력받는다. 올바른 값이 아니면 예외 처리한다.
- 각 코치가 못 먹는 메뉴를 입력받는다. ✔️
(출력)
- 서비스 시작 문구 ✔️
- 메뉴 추천 결과입니다. ✔️
(프로그래밍)
- indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현 ✔️
- 함수(또는 메서드)의 길이가 15라인을 넘어가지 않도록 ✔️
- 함수(또는 메서드)가 한 가지 일만 잘하도록 구현 ✔️
(카테고리와 음식)
- 일식: 규동, 우동, 미소시루, 스시, 가츠동, 오니기리, 하이라이스, 라멘, 오코노미야끼
- 한식: 김밥, 김치찌개, 쌈밥, 된장찌개, 비빔밥, 칼국수, 불고기, 떡볶이, 제육볶음
- 중식: 깐풍기, 볶음면, 동파육, 짜장면, 짬뽕, 마파두부, 탕수육, 토마토 달걀볶음, 고추잡채
- 아시안: 팟타이, 카오 팟, 나시고렝, 파인애플 볶음밥, 쌀국수, 똠얌꿍, 반미, 월남쌈, 분짜
- 양식: 라자냐, 그라탱, 뇨끼, 끼슈, 프렌치 토스트, 바게트, 스파게티, 피자, 파니니
(카테고리)
- 추천할 카테고리는 MissionUtils 라이브러리의 Random.pickNumberInRange()에서 생성해 준 값을 이용하여 정해야 한다 ✔️
- 임의로 카테고리의 순서 또는 데이터를 변경하면 안 된다. ✔️
Randoms.pickNumberInRange()의 결과가 1이면 일식, 2면 한식, 3이면 중식, 4면 아시안, 5면 양식을 추천 ✔️ - 추천할 수 없는 카테고리인 경우 다시 Randoms.pickNumberInRange()를 통해 임의의 값을 생성해서 추천할 카테고리를 정해야 한다. ✔️
(메뉴)
- 추천할 메뉴는 정해진 카테고리에 있는 메뉴를 MissionUtils 라이브러리의 Random.shuffle()을 통해 임의의 순서로 섞은 후, 첫 번째 값을 사용해야 한다.✔️
- 카테고리에 포함되는 메뉴 목록은 문자열 배열 형태로 담아 준비한다. ✔️
- 임의로 메뉴의 순서 또는 데이터를 변경하면 안 된다.✔️
- Randoms.shuffle() 메서드의 인자로 전달되는 메뉴 데이터는, 최초에 제공한 목록을 그대로 전달해야 한다.✔️
- 코치에게 추천할 메뉴를 정할 때 이미 추천한 메뉴, 먹지 못하는 메뉴도 포함된 리스트를 전달해야 한다.✔️
- 추천할 수 없는 메뉴인 경우 다시 섞은 후 첫 번째 값을 사용해야 한다.✔️
InputView - 사용자 입력을 받는 곳
- readCoachName() - 코치 이름 받음✔️
코치이름 중복, 코치 2명미만/5명초과, 코치이름 2글자미만/4글자 초과✔️ - readHateMenu() - 못먹는 메뉴 입력 받음✔️
OutputView() - 결과물 출력하는곳
- printMenu() - 전체결과 출력✔️
- printStart() - 시작 문장 출력✔️
- printEnd() - 끝 문장 출력✔️
- printError() - 에러문장 출력;✔️
Menu - 메뉴 추천하는 곳
카테고리는 Random.pickNumberInRange()를 사용해 정하고
최대 2번까지 카테고리 중복 가능✔️
- pickCategory() - 월요일부터 금요일까지 카테고리 픽업✔️
메뉴를 셔플로 섞어서 무작위
const menu = Randoms.shuffle(menus)[0];//Menu는 무작위 배열 > 못먹거나 이미 선택한 경우 다시 섞어서 첫번째 값 사용✔️
- pickMenu() - 픽한 카테고리에 맞춰 개별로 음식 뽑아주기~✔️
- helpPickMenu() - 코치별 메뉴 고르기~✔️
ErrorHandler - 에러 처리
coachNameError() - 이름 입력시 발생 가능한 에러 처리✔️
hateMenuError() - 싫어하는 메뉴 입력시 발생 가능한 에러 처리✔️
프리코스 첫 시작으로부터 약 한달반이라는 시간이 벌써 지나 이제 마지막이라니 시원섭섭한 마음으로 코딩테스트를 보러왔다. 최종 코딩 테스트는 그동안의 과제를 기반으로 과제를 열심히 풀었다면 누구나풀 수 있는 난이도로 되어있다고 하셔서 그동안 과제들을 시간제한으로 다시 푸는 연습을 했다.
다시 풀어보면서 느낀 것은 확실히 지난 미션을 풀었던 과거의 나에 비해 현재의 내가 발전했다는 것이다.과제 당시에는 미션들을 풀면서 처음 맞이하는 종류의 오류와 에러들때문에 밤도 새며 고생했다고 생각했는데, 그 덕분인지 몰라도 다시풀때는 비슷한 오류를 맞이하면 비교적 수월하게 풀 수 있었다.
코딩테스트를 준비하며 내가 중점적으로 연습했던 것은 readLine의 처리와 반복문에 대한 처리, try-catch의 사용과 비슷한 역할을 하는 메소드끼리의 파일 나누기였다. 지난 과제를 돌아보니 모든 과제에 입력을 반복적으로 받는 부분이 있었고, 미션 유틸의 readLine과 print는 close를 한번 사용하면 다시 사용하지 못하던 경험을 비롯해 메소드끼리의 스택을 쌓아가는 것과 return 값에 대해 헷갈리지 않도록 공부했다.
또한 오류처리는 과제를 통해 처음으로 겪어봤기 때문에 혹시라도 최종코딩테스트에서 오류처리가 나온다면 버벅이지 않도록 여러 오류처리를 해보는 연습을 해보았다. 그런 연습 덕분에 다행히 최종 코딩테스트에서 적어도 내가 원하는 모습으로 작동하는 프로그램을 만들 수 있었던 것 같다.
테스트에서는 메뉴를 만드는 문제가 나왔다. 지난번 과제와 다르게 App.js 파일 하나만 있었기 때문에 비슷한 동작을 하는 기능끼리 나눠보자 해서 나는 추가로 4개의 파일을 생성했다. 사용자 입력을 받는 곳, 결과물을 출력하는 곳, 메뉴를 선별하는 곳, 에러를 처리하는 곳 이렇게 4개로 구분해 나름대로 기능을 구별해 구현하였는데 프리코스가 아니였다면 그냥 App.js 파일 하나에서 구현했을 것 같다.
또한 readme 작성으로 비교적 수월하게 진도가 나갔었다. 다만 마지막 테스트에서도 나를 괴롭히는 오류는 존재했다.
하나는 이중배열의 셋팅값이었다. 배열을 let pickMenu =[] 이렇게 선언 하고 아래에서
pickMenu[i][j] = menu; 이렇게 할당하려했는데 셋팅 값이 잘못되었는지 계속 이 구문에서 오류가 났다. 왜 일까 하고 하나씩 돌려가며 확인해보았는데 이중배열인 것을 프로그램은 인식하지 못해서 난 오류였다. 그래서 명시적으로
let pickMenu = new Array(COACH.length);
for(let i = 0; i <pickMenu.length; i++)
pickMenu[i] = new Array(5);
이렇게 선언해서 오류를 해결했다. let pickMenu =[]; 이렇게 선언해서 이중배열을 넣게되면 어떤 상황에서는 잘 돌아가는데 어떤상황에서는 제대로 돌아가지 않는 경우가 발생한다는 것을 알게 되어 다음부터는 좀더 명시적으로 선언하는 편이 좋겠다 라는 생각을 했다.
두번째 오류는 바로 미션 유틸의 shuffle() 이었다. shuffle()은 인자로 전달된 배열을 무작위로 섞은 배열을 다시 return 해준다. 처음 나는 카테고리별 배열을 인자로 보낸다면 알아서 섞어서 반환 할거라고 생각하여 문자로 되어있는 배열을 인자로 보냈다. 그랬더니 number가 아니라는 오류가 뜨는 것이다.
그때까지는 shuffle()의 인자를 잘못 보낸 것이 아닌 그 앞뒤로 붙어있는 내 코드가 잘못된 줄 알고 헛발을 짚었다. 하지만 코드를 나눠서 하나씩 작동해보았는데 shuffle()의 문제였다는 것을 알게되고, 그렇다면 1부터 9까지 숫자로 되어있는 배열을 인자로 보내 반환된 숫자를 인덱스로 하면 되겠다 라는 해결방법을생각해 적용하였다. 그랬더니 내가 의도한 대로 코드가 돌아가서 코드 작성을 성공 할 수 있었다.
매 과제마다 나에게 생각할 거리를 주고, 에러를 해결해가며 성취감을 느낄 수 있었다.
덕분에 나는 프리코스와 최종 코딩테스트를 통해 개발자로써 정말 많이 성장할 수 있었던 것 같다. 다만 테스트코드 작성은 아직 나에게 좀 어려웠다! 열심히 자료 찾아보며 뚝딱뚝딱 코드를 작성했는데 어딘가 마음에 안드는 것 같아 따로 또 공부를 해야겠구나 하는 생각을 했다.