공부기록

[우아한 테크코스 프리코스] 1주차

_우지 2022. 11. 1. 17:10

🤔 이런 고민을 했습니다.

변수명과 함수명

  • 변수에는 어떤 데이터가 담겨있는지와 함수는 무슨 동작을 하는지 쉽게 파악할 수 있는 네이밍을 짓기위해 노력하였습니다.
  • 예시) isExceptionSituationOccurred 예외상황이 발생했는지 여부를 반환하는 함수

배열 메소드

  • 배열 메소드를 사용했을때 코드 길이와 가독성 측면에서 for문을 사용했을때 보다 이점이 있다고 판단했습니다.
    따라서 로직을 짤때 최대한 배열메소드를 사용하려 노력하였습니다.

for 문 사용

const eachDigitAllMultiply = (bookPage) =>{
  cosnt bookPageArray = String(bookPage).split("")
  let sumOfMultiplication = 1
  for (let i=0; i<bookPageArray.length; i+=1){
    sumOfMultiplication*= Number(curr)
  }

  return sumOfMultiplication
}

 

배열 메소드 사용

const eachDigitAllMultiply = (bookPage) =>
  String(bookPage)
    .split("")
    .reduce((prev, curr) => prev * Number(curr), 1);

 

📖 이런점을 배웠습니다.

Set 자료구조

  • 7번 문제를 풀면서 이미 친구인 사람의 목록을 배열로 만들었습니다. 이제 그 배열에 includes 메소드를 사용하여 아는 사람의 목록을 만들었고, 다른 방법은 없을까 생각해보다가 Set 과 Map 자료구조가 접근하는 시간복잡도가 더 빠르다라는 것이 생각났습니다.
var arr = Array.from({ length: 1000000 }, (_, i) => i);
var set = new Set(arr);
arr.includes(987654);
set.has(987654)
  • 테스트 사이트에서 시간을 측정한 결과 유의미한 차이가 났기때문에 기존 7번 문항에서 includes 메소드를 사용하는 방식에서 set 을 사용하는 방식으로 로직을 변경하였습니다.image

Pipe 함수

처음 제 코드는 다음과 같았습니다.

function problem7(user, friends, visitors) {
  const friendSet = makeFriendSet(user, friends);
  let acquaintanceSet = makeAcquaintanceSet(friends, friendSet);
  acquaintanceSet = differenceOfSet(acquaintanceSet, friendSet);
  const pointMap = giveFriendAlgorithmPoint(acquaintanceSet);
  const copyPointMap = giveVisitorPoint(visitors, pointMap, friendSet);
  const pointArray = convertPointMapToSortedPointArray(copyPointMap);
  return selectTopFive(test);
}

저는 함수명을 보고 어떤 값이 return이 될지 파악할 수 있다고 판단하였고, 변수에 값을 할당하는 과정을 생략해보기로 하였습니다.
검색한 결과 함수 여러개를 이어주는 파이프 함수라는 방법을 찾을 수 있었고 이를 한번 시도해보았습니다.

function problem7(user, friends, visitors) {
  const solve = pipe(
    makeFriendSet,
    makeAcquaintanceSet,
    differenceOfSet,
    giveFriendAlgorithmPoint,
    giveVisitorPoint,
    convertPointMapToSortedPointArray,
    selectTopFive
  )({ user, friends, visitors });

  return solve;
}

처음 시도해보아서 코드 가독성은 어떤지 커뮤니티가 열리면 참여하신분들에게 여쭤보고싶습니다.

Git rebase

과제를 이해했을때 각 문제들이 구현기능이라고 파악을 하였습니다. 하지만 슬랙 커뮤니티를 살펴보니 각 문제별로 기능목록을 작성하여 구현하셨다는 분이 계셨고, 저도 그렇게 바꾸는게 낫다고 생각했습니다.
하지만 이미 fork 한 레포에 commit이 push 가 되어있는 상태였기때문에 commit history를 변경하기 위해 rebase 를 사용하여 새로운 commit을 추가했습니다. 이번과제를 통해 익숙하지 않던 rebase 명령어를 사용할 수 있어 좋았습니다.