ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 항해 99 5기 TIL_29
    항해 99 2022. 2. 7. 23:53

    ▶ Today I Learned

     

    <알고리즘 스터디>

     

    신고결과 받기 (카카오 블라인드 테스트 - 프로그래머스 레벨 1)

    소요시간: 1시간

    시간 내 문제해결 여부: 미해결

    https://programmers.co.kr/learn/courses/30/lessons/92334

     

    let id_list = ["muzi", "frodo", "apeach", "neo"]
    
    let report = ["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"]
    
    // ["ryan con", "ryan con", "ryan con", "ryan con"]
    
    
    let k = 2
    
    // 예상 결과 result 값 [2,1,1,0]
    
    // 문자열 알파벳 소문자, 중복 아이디 x 동일 유저 신고 여려번 해도 1회로 처리
    
    let i = 0
    let reporters = []
    let reported = []
    let noDoubleReports = []
    
    // 신고 중복검사
    for (let j = 0; j < report.length; j++) {
    
      if(noDoubleReports.includes(report[j])) {
        j++
      } else {
        noDoubleReports.push(report[j]);
      }
      
    }
    console.log(noDoubleReports);
    
    for(i; i < report.length ; i++) {
    
    reporters.push(noDoubleReports[i].split(' ')[0]);
    reported.push(noDoubleReports[i].split(' ')[1]);
    
    }
    
    console.log(reporters);
    console.log(reported);
    let reportedCount = []
    
    let t = 0
    let count = 0 // 추후에 카운트에 1을 더해주어야 함 
    while (t < reported.length) {
    
      if(reportedCount[t].includes(reported[t])){
        reportedCount.push(reported[t])
        count++ // 두번째부터 셀 것
        t++
      } else {
        
        t++
      }
    } 
    let finalCount = count + 1
    
    if(k <= finalCount) { reportedCount
    
    }
    
    
    
    // 신고당한 사람 횟수 체크 후
    // 신고자와 신고당한자의 연결이 필요하지 않나?

    좀 더 고민하여 풀어보아야겠다.

     

    cf) 소중한 팀원이신 한나님 :3 께서 set()이라는 기능을 써보았다고 알려주셨다.

    set()의 경우 중복값을 받아오지 않는다고 하셨다.

    공식문서에서도 배열 내 중복값을 제거해준다고 한다.

    아래는 공식문서에서 가져온 예시이다.

     

    // Use to remove duplicate elements from the array
    
    const numbers = [2,3,4,4,2,3,3,4,4,5,5,6,6,7,5,32,3,4,5]
    
    console.log([...new Set(numbers)])
    
    // [2, 3, 4, 5, 6, 7, 32]

    위 예시에 따라 Set을 constructor를 이용해 객체로 만든 후 배열에 사용해보도록 하자.

     

     

    <TDD>

     

    어제 해결하지 못한 문제를 드디어 해결할 수 있었다..!

     

    ㅊ addBoard(board) {
            if (this.boards.length === 0) {
                this.boards.push(board);
                // 푸쉬하게 되면 Site { boards: [ Board { name: '공지사항' } ] }와 같은 모양이 됨
            } else {
                let i = 0;
                for (i; i < this.boards.length; i++) {
                    if (this.boards[i].name === board.name) {
                        throw this.addBoard(board);
                    } else {
                        return this.boards.push(board); //  여기서 만약 return이 없으면 에러가 발생한다.
                        // Error name:  "TypeError"
                        // Error message: "addedBoard.publish is not a function"
                    }
                }
            }
        }

     

    먼저 this.boards 의 첫 시작은 Site { boards: [] } 라는 빈 배열이다.

    여기서 this.boards.length가 0, 즉 배열 내 아무것도 없다면 처음들어오는 board 객체이므로 무조건

    push해서 배열 내 넣어준다. (cf: board는 Board {name: '공지사항'}과 같은 객체 값이다.)

    여기서 this.boards[0]을 꺼내자면 {name: '공지사항'}이라는 객체 형태가 그대로 나와버린다.

    그럼 여기서 그 다음 board가 설령 {name: '공지사항'}이라해도 앞의 객체와 같다고 할 수 없다.

    원시자료형이었다면 값이 같은지 다른지를 비교하지만 객체끼리라면 메모리상 주소값을 비교하기 때문이다..!

    각각의 객체는 매번 new라는 연산자를 써서 새로운 객체를 생성한다. 즉, 들어있는 값 자체가 같아도 별개의 객체이기 때문에 나타내는 주소는 다르다..!

    애초에 프로젝트의 목표는 name이 같은 경우를 배제하는 것이었어서 name이라는 값의 비교를 하는 것이 맞다.

    따라서 this.boards[i].name === board.name 라는 식으로 기존 배열에 들어있는 name값과 추가되려는 또다른 객체 내부의 name값을 비교하여 같다면 이미 배열에 그런 값의 name이 있다는 말이다. 따라서 요구사항대로 addBoard()작업을 throw하면 된다. 

    그게 아니라면 정상적으로 push를 써서 추가해주면 된다.

     

    단, push 부분에서는 return을 써주어야 한다.

    만약 쓰지 않는다면 위의 코드에서 추가하려는 board의 name이 다를 경우,

    this.boards.push(board);를 하게되면 for문 내 배열의 길이가 늘어나 작업이 멈추지 않을 수 있기 때문이다.

    return을 쓰게되면 그 자리에서 반복문을 종료하고 return 뒤의 구조를 실행하게 된다.

    따라서 무한루프에 빠지지 않게 된다..! 문제 해결..! 유휴! ;)

     

     

     

    ▶ 느낀 점

     

    여전히 할 것은 많고 피곤하기도 하다. 하지만 여태껏 그래왔듯 포기할 생각은 1도 없다..!

    존버는 승리한다..! :3

    카카오 문제는 레벨 1이고 비교적 쉬운 수준이나 1시간 동안 풀 수 없었다는 게 충격이지만

    단계를 밟아나가며 하다보면 충분히 할 수 있을거라 믿는다..!

    끝날 때 즈음엔 레벨 2 이상은 충분히 풀 수 있길...!

     

     

    ▶ 공부 시 참고 링크들

     

    http://www.gisdeveloper.co.kr/?p=6340 

     

    개발성 향상을 위한 JavaScript의 주석 – GIS Developer

    JavaScript는 type이 불명확하므로 문서화를 통해 그 상세정보를 남겨야 합니다. 그러나 소스코드와 분리된 문서는 사실상 그 활용가치가 매우 떨어집니다. 소스코드와 일원화된 방식으로 문서화가

    www.gisdeveloper.co.kr

     

     

    https://pro-self-studier.tistory.com/28

     

    9. 메서드를 선언할 때 function을 생략, method shorthand

    안녕하세요, 프로독학러 입니다. 이번 포스팅에서는 ES6의 method shorthand에 대해서 알아보겠습니다. 표현식부터 살펴보도록 하겠습니다. // 단축 메서드명 (ES6) var o = { property([parameters]) {}, get pr..

    pro-self-studier.tistory.com

     

     

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set

     

    Set - JavaScript | MDN

    The Set object lets you store unique values of any type, whether primitive values or object references.

    developer.mozilla.org

     

     

     

     

     

     

     

     

     

     

    '항해 99' 카테고리의 다른 글

    항해 99 5기 TIL_31  (0) 2022.02.10
    항해 99 5기 TIL_30  (0) 2022.02.09
    항해 99 5기 WIL_4  (0) 2022.02.06
    항해 99 5기 TIL_28  (0) 2022.02.06
    항해 99 5기 TIL_27  (0) 2022.02.06
Designed by Tistory.