우테코 5기 프리코스 1주차 회고

우테코 프리코스 1주차 회고

프리코스 시작

오랫동안 기다리던 우테코 프리코스가 드디어 시작되었다!

이번 5기에서는 모든 참가자에게 배움의 기회를 제공하기 위해 이전과 달리 1차 코딩테스트를 없애고 모든 참가자들이 프리코스에 참가할 수 있는 기회를 주었는데 이번에 프론트, 백엔드, 모바일 합쳐 총 3300명 정도가 지원한것 같다.

이런 기회를 제공해 준 우테코에게 감사하고 4주간 많은 걸 배우고 성장해 개발 생태계에 좋은 영향을 줄 수 있도록 성장하여 기여하는 게 보답하는 길이지 않을까 싶다.

프리코스 1주차

이번 1주 차 미션은 이전과는 달리 코딩 테스트 7문제 였는데 아마 2주 차부터 숫자 야구, 자동차 경주 같은 미션을 줄 거라 예상이 된다.

이번 미션은 그냥 풀기에 미션 난이도는 어렵지 않았지만 일주일 동안 이 7문제를 미션으로 내준 것이기 때문에 단순하게 푸는 것만이 중요한 게 아닌 것 같아 바로 시작하지 않았다. 시작하기 전 자바 컨벤션, 클린 코드, 깃 컨벤션 등 미리 사전 공부를 하였고 어떻게 설계를 해야 될지 많은 고민을 했던 것 같다.

하지만 역시 설계는 쉽지 않았고 오히려 처음부터 설계 전체를 생각하니 머리에 과부하가 왔다. 그리고 컨벤션에 익숙하지 않았기 때문에 더 어려움을 겪었던 것 같다.

이번에 사전 공부한 것을 최대한 지키면서 짜려고 노력했지만 아직 부족함을 많이 느꼈다. 하지만 어떻게 코드를 짜야 할지 많은 생각을 해보게 되었고 아직 첫 주 차지만 생각보다 많은 걸 얻어 두 번째 미션에서 더 잘해내어 성장할 수 있을 것 같다.

진행 과정

  1. 자바 컨벤션, 클린 코드, 깃 컨벤션 등 사전 공부
  2. 문제 이해, 로직 구상
  3. 구현 기능 목록 작성
  4. 코드 구현
  5. 리뷰 및 과제 제출

1. 컨벤션, 클린 코드 등 사전 공부

참고한 자료:


자바 컨벤션(Java Convention)

공통(Common)

  • 변수명, 클래스명, 메서드명 등에는 영문/숫자/언더스코어만 허용
  • 한국어 발음대로 표기 금지
    • 좋은 예 - asset(자산)
    • 나쁜 예 - jasan(자산)

패키지(Package)

  • 패키지 이름은 소문자로 구성
    • ex) package com.mu.apigateway

인터페이스(Interface)

  • 인터페이스 이름에 대문자 카멜표기법 적용
    • ex) CamelCase
  • 인터페이스 이름에 명사/형용사 사용

클래스(Class)

  • 클래스 이름에 대문자 카멜표기법 적용
    • ex) CamelCase
  • 클래스 이름에 명사 사용
  • 테스트 클래스는 ‘Test’로 끝맺음

메서드(Method)

  • 메서드 이름에 소문자 카멜표기법 적용
    • camelCase
  • 메서드 이름은 동사/전치사로 시작
    • ex) toString(), renderHtml()

변수(Variable)

  • 상수는 대문자와 언더스코어로 구성
    • ex) public final int CHECK = 1;
    • ex) public final String SECRET_KEY = “secret”;
  • 변수에 소문자 카멜표기법 적용
    • ex) private int accessToken;


클린 코드(Clean code)

추가 체크리스트

  • 한 메서드에 오직 한 단계의 들여쓰기(indent)만 허용했는지?
  • else 예약어를 쓰지 않았는가?
  • 모든 원시값과 문자열을 포장했는가?
  • 콜렉션에 대해 일급 콜렉션을 적용했는가?
  • 3개 이상의 인스턴스 변수를 가진 클래스를 구현하지 않았는가?
  • getter/setter 없이 구현했는가?
    • 단, DTO는 허용
  • 메소드의 인자 수를 제한했는가?
    • 최대 3개 까지 허용, 가능하면 줄이기 위해 노력
  • 코드 한 줄에 점(.)을 하나만 허용했는가?
  • 메소드가 한가지 일만 담당하도록 구현했는가?
  • 클래스를 작게 유지하기 위해 노력했는가?


깃 컨벤션(Git Convention)

커밋 메시지 형식

<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>

커밋 메시지의 기본형식은 위와 같고 100자를 넘을 수 없습니다.

type

  • feat : 새로운 기능 추가
  • fix : 버그 수정
  • docs : 문서 수정
  • style: 코드 포맷 변경
  • refactor : 코드 리팩토링
  • test : 테스트 코드 추가
  • chore : 빌드, 패키지 매니저 수정

scope

커밋 변경 위치를 지정

  • ex) $location, $browser, $compile, $rootScope, ngHref, ngClick, ngView, etc…

subject

코드 변경 사항에 대한 짧은 요약

  • 현재 시제의 명령어 사용
  • 첫글자 대문자 사용 X
  • 끝에 점(.) 사용 X

body

변화에 대한 동기와 이전 행동과의 대조를 포함

  • 현재 시제의 명령어 사용

모든 주요 변경 사항에 대한 설명, 정당성 및 마이그레이션 참고사항

참고 예제

feat($browser): onUrlChange event (popstate/hashchange/polling)

Added new event to $browser:
- forward popstate event if available
- forward hashchange event if popstate not available
- do polling when neither popstate nor hashchange available

Breaks $browser.onHashChange, which was removed (use onUrlChange instead)
docs(guide): updated fixed docs from Google Docs

Couple of typos fixed:
- indentation
- batchLogbatchLog -> batchLog
- start periodic checking
- missing brace
style($location): add couple of missing semi colons


2. 문제 이해, 로직 구상

각 문제를 이해하고 코드를 구현하기 전 어떤 로직으로 풀어야 될지 어떻게 설계해야 될지 많은 고민을 했는데 위에서 말했듯이 한 번에 설계하기엔 아직 나에게 무리였다… 그래서 구현 기능 목록을 작성해 하나하나 풀어나가려고 계획했다.

3. 구현 기능 목록 작성


구현 기능 목록

🚀 구현할 기능 목록


PROBLEM1

페이지 오류 검사

  • 페이지 범위 (3 ~ 398) 벗어날 시 예외 처리
  • 왼쪽페이지 홀수 && 오른쪽 페이지 짝수 아닐시 예외 처리
  • 왼쪽 페이지 +1 = 오른쪽 페이지가 아닐시 예외 처리

해당 페이지의 가장 큰 숫자 계산

  • 각 자리 수 더한 것, 각 자리 수 곱한 것 중 큰 것 반환

점수 비교

  • 포비가 이기면 1 반한
  • 크롱이 이기면 2 반환
  • 무승부시 0 반환

PROBLEM2

연속된 중복 문자 제거

  • 연속된 중복 문자는 한번에 제거
  • 연속된 중복 문자가 없을때 까지 반복 후 반환
    • 반환한 문자열이 같은 경우
    • ”” 공백인 경우

PROBLEM3

각 자리수로 분할

해당 숫자가 3, 6, 9인지 검사

number까지 손뼉 수 계산

PROBLEM4

반대 문자로 변경

  • ’ ‘ -> ‘ ‘
  • 대문자, 소문자 구별
  • 맞는 페어 문자로 변경(끝 번호 - 자기 번호 + 시작 번호)

PROBLEM5

높은 금액 순으로 바꿀 수 있는 화폐로 교환

  • 50000 -> 10000 -> 5000 -> 1000 -> 500 -> 100 -> 50 -> 10 -> 1

PROBLEM6

닉네임마다 나올 수 있는 연속적인 문자 저장

  • 나올 때 마다 해시맵을 이용해 +1씩 저장

저장된 연속적인 문자 중 중복이 있는 유저 확인

  • 해시멥에 값이 2이상이면 중복

문제(연속적인 문자가 겹치는 유저) 있는 이메일 리스트 반환

  • 오름차순 정렬, 중복 제거

PROBLEM7

친구 추가 기능 구현

사용자와 함께 아는 친구를 가진 유저 확인

타임 라인 유저 확인

높은 점수 순으로 최대 5명 반환

  • 추천 점수가 0점은 제외
  • 추천 점수가 같은 경우 이름순으로


4. 코드 구현

https://github.com/parkmuhyeun/java-onboarding

thumbnail

5. 리뷰 및 과제 제출

문제들을 리뷰 하던 도중 6번 문제에서 더 개선 할 수 있는 방법을 떠올리게 되었고 개선하여 최종적으로 제출하였다.

6번 문제의 기능 중 닉네임마다 나올 수 있는 연속적인 문자를 가져오는 부분에서 나는 기존에 모든 가능성을 다 가져와 연산했었다. 그렇게 되면 예를 들어 “카타리나”같은 경우 “카타”, “카타리”, “카타리나”, “타리”, “타리나”, “리나”로 시간 복잡도가 n * (n-1) / 2 즉 O(n^2)이 걸려 총 시간 복잡도가 10000(최대 크루 수) * 19(max 닉네임 길이) * 19으로 3610000이 걸렸다.

이렇게 하여도 문제없으나 다음과 같이 줄이면 더 개선할 수 있다. 어차피 세 글자부터는 이미 두 글자에서 중복으로 처리되기 때문에 연산할 필요가 없어서 두 글자의 조합만 추가하여 계산해도 된다. 즉, “카타리나”에서 “카타”, “타리”, “리나”만으로만 검사해도 “카타리”, “카타리나”, “타리나” 같은 세 글자 이상 포함된 다른 크루들도 처리할 수 있다.

개선하게 되면 n-1이 걸려 O(n)으로 총 시간 복잡도는 10000 * 19 = 190000으로 단축되게 된다. 그렇게 개선하고 나서 Github에 Pull Request하고 우테코 플랫폼에도 제출하여 1주 차는 이렇게 마무리하게 되었다.

정리 및 후기

이번에 상당히 많이 고민하며 설계하고 구현해 보았는데 부족한 점을 많이 느꼈다. 물론 컨벤션도 익숙하지 않지만 특히 설계 부분에서 많이 당황했다. 그동안 객체 지향에 대해 어느 정도 알고 있다고 생각했었는데 그 생각이 완전히 깨졌으며 아직 한참 멀었구나 느꼈다.

그래서 다음 미션까지 두 가지의 목표를 세웠다.

이번에 5기 프리코스에서 새로 우테코 커뮤니티라는 시스템을 도입한다고 했다. 현재는 Slack으로 하고 있는데 2주 차부터는 추가적으로 Github에 커뮤니티를 열어준다고 해서 기대 중이다!

Slack에서 다들 유용한 정보 공유, 에러 해결 방법, QnA 등을 이용해 서로 함께 도와가며 힘내고 있다. 이번 주에 Slack 없이 혼자 코딩했으면 너무 쓸쓸했을 것 같다.. 다 같이 파이팅 해가며 함께 진행하는 이 분위기가 너무 좋았는데 이것이 우테코에서 의도했던 바가 아닐까.


우테코 Slack


개발에서는 끝없이 배울 것이 나오고 변화가 빠르기 때문에 공유 문화가 더욱 중요하다고 생각되고 그만큼 협력, 커뮤니케이션 같은 함께 자라기의 중요성이 커졌다. 그렇기 때문에 나도 Slack에서 유용한 정보를 최대한 공유하려고 하고, 많은 분들에게 도움드리려고 노력하고 있다. 그리고 그만큼 다른 분들에게서도 많은 것을 배우고 얻어 가고 있다.


*틀린 부분이 있으면 언제든지 말씀해 주시면 공부해서 수정하겠습니다.


© 2022. All rights reserved.

Powered by 애송이