[우아한테크코스 FE 5기] 프리코스 1주차 온보딩 미션 회고

Chex·2022년 11월 3일
2

우아한테크코스

목록 보기
1/19
post-thumbnail

🍳 온보딩 미션


🚀 기능 요구 사항

아래의 7가지 기능 요구 사항을 모두 해결해야 한다.

  1. 문제 1
  2. 문제 2
  3. 문제 3
  4. 문제 4
  5. 문제 5
  6. 문제 6
  7. 문제 7

🔗 관련 링크


🐾 기능구현 목록

문제1

  1. 예외사항을 처리하는 기능
    오른쪽 페이지와 왼쪽 페이지의 차가 1이 아닌 경우 -1을 리턴
    페이지가 1~400의 범위를 벗어나는 경우 -1을 리턴
  2. 페이지 번호를 입력받아 각 자리 숫자를 모두 더하거나 곱해서 가장 큰 수를 구하는 기능
  3. 본인의 점수를 구하는 기능
    2번 기능으로 왼쪽, 오른쪽 페이지의 결과값을 구하여 더 큰 값을 본인의 점수로 설정함
  4. 포비와 크롱의 점수를 비교하는 기능
    무승부일 경우 0을 리턴
    포비가 이길 경우 1을 리턴
    크롱이 이길 경우 2를 리턴
  5. 최종 결과를 리턴하는 기능

문제2

  1. 예외사항을 처리하는 기능
    cryptogram의 길이가 1보다 작거나 같으면 cryptogram 리턴
  2. 알파벳 소문자를 배열에 담아 반환하는 기능
  3. 연속하는 중복 문자열이 있는지 확인하는 기능
    연속하는 중복 문자열이 있다면 해당 문자열 삭제
    연속하는 중복 문자열이 없다면 answer 리턴
  4. 연속하는 중복 문자열을 삭제하는 기능

문제3

  1. 현재 숫자에 3,6,9가 들어간다면 손뼉을 몇 번 쳐야 하는지 구하는 기능
    3, 6, 9의 개수만큼 손뼉을 쳐야함
  2. 1번부터 number까지 손뼉을 몇 번 쳐야 하는지 횟수를 리턴하는 기능

문제4

  1. 청개구리 사전을 만드는 기능
  2. 입력값이 알파벳인지 확인하는 기능
  3. 청개구리 사전에서 알파벳만을 찾아 변환하는 기능
    알파벳 대문자는 알파벳 대문자로 변환
    알파벳 소문자는 알파벳 소문자로 변환

문제5

  1. 돈의 액수와 화폐종류가 주어질 때 변환될 수 있는 화폐의 최대 개수를 구하는 기능
  2. 각 화폐가 몇개로 변환되는지 구하는 기능
    금액이 큰 순서대로 배열에 담음

문제6

  1. 예외사항을 처리하는 기능
    크루가 1명인 경우 종료
  2. 두 크루의 닉네임이 중복인지 판단하는 기능
  3. 이메일 목록을 오름차순으로 정렬하는 기능
  4. 중복된 닉네임을 신청한 크루의 이메일 목록을 만드는 기능
    i번 크루는 i+1번~n번 크루와 비교함
    현재 크루와 비교대상 크루가 모두 overlaps배열에 체크되어 있다면 다음 비교대상 크루로 넘어감
    현재 크루의 닉네임과 비교대상 크루의 닉네임이 중복이라면 overlaps배열에 체크함
    set자료구조를 사용해 중복 이메일 제거

문제7

  1. 친구관계를 Map객체로 저장하는 기능
    key: 아이디
    value: Set(친구1, 친구2, ...)
  2. 추천친구 후보목록을 Map객체로 저장하는 기능
    key: 아이디
    value: 추천점수
  3. 추천친구 후보들의 추천점수를 계산하는 기능
    3-1. 사용자가 함께 아는 친구 수로 점수 계산
    3-2. 사용자의 타임 라인에 방문한 횟수로 점수 계산
    추천친구 후보목록에 없는 아이디라면 추천친구 후보목록에 추가
    3-3. 총 점수 합산
  4. 추천친구 후보목록을 추천점수 기준 내림차순으로 정렬하는 기능
    추천점수가 같은 경우 이름(아이디) 기준 오름차순으로 정렬
  5. 예외사항 처리
    추천점수가 0인 경우 추천친구에서 제외
    최종 결과는 최대 5명만 리턴함

🔎 후기

📖 배운점

  1. 개발환경: node.js v14.20.1, Visual Studio Code로 세팅하였습니다.
  1. 커밋 메시지 컨벤션유다시티 커밋 메시지 스타일 가이드를 참고하였습니다.
  2. 기능을 구현하기 전에 기능구현 목록을 만들었습니다.
  3. 문제의 요구사항 대로 기능 단위로 커밋하는 방식으로 진행했습니다.

✏️ 느낀점

1. Git에 대해 학습하면서 느낀점

예전부터 github 계정은 있었지만 잘 사용하지 않아 git 사용법에 익숙하지 않았습니다.

사실 지금도 git의 복잡한 기능들은 잘 모르겠지만 이번에 프리코스를 하면서 git status로 상태를 확인하고 git add로 업로드할 코드를 스테이지에 올리고(지옥에서 온 git이라는 유튜브 강의를 들었습니다! add를 하면 commit하기 전 대기공간인 스테이지에 올라간다는 것을 알게 되었습니다.) 그리고 commit을 하면서 커밋 메시지를 작성하는 기본 루틴에는 익숙해질 수 있었습니다. 여기서 또 커밋메시지에 관해서 다시 찾아보았는데요. 미래의 자신과 제 코드를 볼 수도 있는 다른 사람들을 위해 가독성이 좋고 정형화된 커밋메시지를 작성하고 싶었습니다. 제가 작성한 코드를 보고도 이해를 못했던 경험 때문에요.. 그래서 가독성 좋은 다양한 커밋메시지 컨벤션을 찾아보다가 기존에 코치님이 작성하셨던 커밋메시지 스타일에 맞추는 것이 좋을 것 같단 생각에 유다시티 커밋 메시지 스타일 가이드를 참고하여 커밋메시지를 작성해보았습니다. 문제를 다 풀고 커밋히스토리를 보니 깔끔하게 맞춰진 커밋메시지 스타일에 기분이 좋았습니다.

기능을 구현하기 전에 기능 목록을 만들고, 기능 단위로 커밋하는 방식으로 진행한다

위와 같은 요구사항에 맞춰 기능을 구현하기 전에 구현할 기능 목록을 먼저 만들어서 정리 했습니다. 객체지향 개발 원칙 중 단일책임의 원칙을 글로 배웠고 알고리즘 문제를 풀 때에도 적용하려고 노력해왔었지만 이렇게 직접 기능 목록을 먼저 작성한 후에 구현을 해보니 이런 방식이 단일책임원칙을 적용하는 데에 더 도움을 주는 방식이라는 것을 느꼈습니다. 구현하기 전에 작성한 기능 목록을 먼저 확인하고 그 기능만을 생각하면서 구현해서 그랬던 것 같습니다. 또 이렇게 구현한 후 기능 단위로 커밋하는 것은 조금 번거로운 면도 있었지만 나중에 수정사항이 생겼을 때 확인하기 편할 것 같다는 생각을 했습니다. Git을 사용해보면서 좀더 git에 대해 공부해보고 싶어서 "팀 개발을 위한 Git, GitHub 시작하기"라는 책을 샀는데 프리코스를 진행하면서 배운 내용을 적용해 볼 수 있었으면 좋겠습니다.

2. 자바스크립트에 대해 학습하면서 느낀점

자바스크립트를 공부하기 위해 모던 자바스크립트 책을 샀었는데 프리코스 이전에는 두꺼운 책의 두께에 놀라 어디서부터 시작해야할지 조금 막막함을 느꼈습니다. 프리코스를 진행하면서 문제 해결에 필요한 부분을 찾아서 공부했기 때문에 제가 필요한 부분에 대해서는 다른 부분 보다 더 집중하면서 공부할 수 있어 좋았습니다.

7번 문제를 풀면서 어떤 자료구조를 사용해야 간단하게 구현하면서 시간복잡도를 줄일 수 있을지 고민하는 과정에서 시간을 많이 썼던 것 같습니다. 처음엔 친구관계를 인접행렬로 나타내서 사용자가 함께 아는 친구 수로 점수를 계산할 때 좀더 빠르게 처리할 수 있도록 해주려고 했으나 모든 사용자 목록이 주어진 것이 아니어서 처리가 지저분해질 것 같았습니다. 그래서 자바스크립트의 Set객체를 찾아보았고 set.has()의 시간복잡도가 O(1)이라는 것을 알아내서 친구관계를 Map객체로 저장(key: 아이디, value: Set([친구1, 친구2, ...]))한 후 각 사용자별 친구들을 set객체로 저장하여 현재 사용자와 함께 아는 친구가 있는지 비교해주었습니다. 이렇게 구현을 하면서 제가 주로 사용하던 언어인 파이썬과 비교가 되는 부분이 있었는데 파이썬에서 dict[key]형식으로 접근하거나 dict[key] = change_value로 값을 바꾸는 것을 자바스크립트의 Map이나 Set객체에서는 할 수가 없어서 불편함을 느꼈습니다. 그래서 또 알아보니 자바스크립트의 객체는 위와 같은 방식으로 사용할 수 있으며 hasOwnProperty() 연산도 시간복잡도가 O(1)이라는 것을 알게 되었습니다. 그래서 다음에 비슷한 경우가 있을 때 자바스크립트 Object를 사용해봐야겠다고 생각했습니다. 또한 아직 자바스크립트에 익숙하지 않아서 프론트엔드 동료분들이 공유해주신 자바스크립트 내장객체에 관한 포스팅을 읽어볼 생각입니다.

그리고 문제를 푸는 과정에서 테스트케이스에 포함되지 않은 예외사항들을 생각하는 과정에서도 어려움을 겪었는데요.. 7번 문제의 경우 user의 친구가 없는 경우, 유저의 친구들을 저장한 set이 생기지 않아 undefined인지 확인하는 코드를 추가해야했습니다. 위와 같은 예외사항은 슬랙에 테스트케이스를 공유해주었던 예비크루들 덕분에 발견할 수 있었습니다.(하지만 이렇게 테스트케이스 공유를 하는 것은 지양해야한다고 하니 이제 직접 많이 많이 고민해봐야겠습니다.) 이것 외에도 문제에 나와있지 않았던 문자열 비교 기준에 대해 슬랙에 질문을 올렸었는데 다른 크루들이 참고할 만한 사이트를 알려주는 등 도움을 많이 주었습니다. 이렇게 예비크루들에게 도움을 받고 다른 예비 크루들이 슬랙에서 서로 도움을 주고 받는 모습을 보면서 무언가 든든함(?)을 느꼈습니다. 그리고 프리코스에서 매주 과제가 진행되다보니 매주 뚜렷한 목표가 있어서 주어진 과제를 풀고 공부하는 과정에서 정말 큰 즐거움을 느꼈습니다. 그리고 1주차 과제를 수행해보니 더욱 배움에 대한 욕심이 생긴 것 같습니다. 2주차도 행복하게! 파이팅!

Be the best version of you!

profile
Fake It till you make It!

0개의 댓글

관련 채용 정보