-
항해 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
https://pro-self-studier.tistory.com/28
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set
'항해 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