From ae461e11be3676092626214e0f057996ecc7ad1a Mon Sep 17 00:00:00 2001 From: Hennization Date: Wed, 8 Jun 2022 17:38:20 +0900 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../README.md" | 24 ++++++++++++ .../solution.js" | 37 +++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 "problems/\354\213\240\352\263\240\352\262\260\352\263\274\353\260\233\352\270\260/README.md" create mode 100644 "problems/\354\213\240\352\263\240\352\262\260\352\263\274\353\260\233\352\270\260/solution.js" diff --git "a/problems/\354\213\240\352\263\240\352\262\260\352\263\274\353\260\233\352\270\260/README.md" "b/problems/\354\213\240\352\263\240\352\262\260\352\263\274\353\260\233\352\270\260/README.md" new file mode 100644 index 0000000..b353dc4 --- /dev/null +++ "b/problems/\354\213\240\352\263\240\352\262\260\352\263\274\353\260\233\352\270\260/README.md" @@ -0,0 +1,24 @@ +# 프로그래머스 기능 개발 + +**문제 )** + +신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. + +- 각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다. + 신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다. + 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다. +- k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다. + 유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다. + +**해결과정)** +report를 공백 기준으로 앞과 뒤를 나눈다. +report의 요소가 완전히 같은 건 제외. + +1. 유저가 신고한 ID를 추려내 신고당한 횟수 확인 + report의 요소 중 완전히 같은 건 삭제한 배열 리턴 + id_list를 돌면서 id가 report 뒤 id(중복 제거 배열을 공백 기준으로 나누기)와 같을 경우, 해당 아이디의 신고당한 횟수 +1 해서 신고당한 횟수 배열 만들기 + +2. k번 이상일 때 정지된 ID 배열 만들기 + +3. id_list를 돌면서 결과메일 받을 id 확인하기 + id가 report 앞 id와 같을 때, report 뒤 id가 2.의 배열의 요소가 있는지 카운트 하기 diff --git "a/problems/\354\213\240\352\263\240\352\262\260\352\263\274\353\260\233\352\270\260/solution.js" "b/problems/\354\213\240\352\263\240\352\262\260\352\263\274\353\260\233\352\270\260/solution.js" new file mode 100644 index 0000000..0e9558f --- /dev/null +++ "b/problems/\354\213\240\352\263\240\352\262\260\352\263\274\353\260\233\352\270\260/solution.js" @@ -0,0 +1,37 @@ +function solution(id_list, report, k) { + let answer = []; + const reportNumArr = []; // 신고당한 횟수 배열 + const suspensionIdArr = []; // 정지된 id 배열 + + //report에서 중복 제거하기 + const removeRepeat = [...new Set(report)]; + // 신고당한 횟수 배열 만들기 + id_list.map((id) => { + // id와 reportedId가 같을 때 해당 아이디 신고당한 횟수에 +1 + let reportedNum = 0; + removeRepeat.forEach((reportElement) => { + const [reportId, reportedId] = reportElement.split(" "); + if (reportedId !== id) return; + reportedNum++; + }); + reportNumArr.push(reportedNum); + }); + // k번 이상일 때 정지된 ID 배열 만들기 + reportNumArr.forEach((reportNum, idx) => { + if (reportNum >= k) suspensionIdArr.push(id_list[idx]); + }); + + // id_list를 돌면서 결과메일 받을 id 확인하기 + id_list.map((id) => { + let resultMailCount = 0; + removeRepeat.forEach((reportElement) => { + const [reportId, reportedId] = reportElement.split(" "); + if (reportId !== id) return; + if (!suspensionIdArr.includes(reportedId)) return; + resultMailCount++; + }); + answer.push(resultMailCount); + }); + + return answer; +} From 0385af8972a88be5c69a277e1ce880d4272e7a0f Mon Sep 17 00:00:00 2001 From: Hennization Date: Wed, 8 Jun 2022 20:18:23 +0900 Subject: [PATCH 2/4] =?UTF-8?q?feat:=20=EA=B8=B0=EB=8A=A5=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20/=20=EC=8B=9C=EA=B0=84=20=EC=B4=88=EA=B3=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solution.js" | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git "a/problems/\354\213\240\352\263\240\352\262\260\352\263\274\353\260\233\352\270\260/solution.js" "b/problems/\354\213\240\352\263\240\352\262\260\352\263\274\353\260\233\352\270\260/solution.js" index 0e9558f..e0e45e4 100644 --- "a/problems/\354\213\240\352\263\240\352\262\260\352\263\274\353\260\233\352\270\260/solution.js" +++ "b/problems/\354\213\240\352\263\240\352\262\260\352\263\274\353\260\233\352\270\260/solution.js" @@ -6,7 +6,7 @@ function solution(id_list, report, k) { //report에서 중복 제거하기 const removeRepeat = [...new Set(report)]; // 신고당한 횟수 배열 만들기 - id_list.map((id) => { + id_list.forEach((id) => { // id와 reportedId가 같을 때 해당 아이디 신고당한 횟수에 +1 let reportedNum = 0; removeRepeat.forEach((reportElement) => { @@ -14,15 +14,21 @@ function solution(id_list, report, k) { if (reportedId !== id) return; reportedNum++; }); + // 단일 반복문으로 만들어야 함 -> 단일 반복문 뭐로? + // id를 돌리는 게 문제다 => report를 돌려서 저장해야한다. + // 걍 배열을 저장하는 방식이 틀림. + // 무작정 push가 아니라 빈배열이 아니라, index나 키로 접근해야함 + // id 업이도 돌아가는 방법을 생각해야함. + // 단지 시간초과 때문에 이생각 + // 여기서 틀린 것을 어떻게 고치는지 메모하기 reportNumArr.push(reportedNum); }); // k번 이상일 때 정지된 ID 배열 만들기 reportNumArr.forEach((reportNum, idx) => { if (reportNum >= k) suspensionIdArr.push(id_list[idx]); }); - // id_list를 돌면서 결과메일 받을 id 확인하기 - id_list.map((id) => { + id_list.forEach((id) => { let resultMailCount = 0; removeRepeat.forEach((reportElement) => { const [reportId, reportedId] = reportElement.split(" "); From e26f0952b11b3d5760f40da05fe36b20f4ed622d Mon Sep 17 00:00:00 2001 From: Hennization Date: Thu, 9 Jun 2022 15:11:36 +0900 Subject: [PATCH 3/4] =?UTF-8?q?feat:=20=EC=8B=9C=EA=B0=84=EC=B4=88?= =?UTF-8?q?=EA=B3=BC=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../README.md" | 16 +++---- .../solution.js" | 43 ++++++------------- .../solution1.js" | 43 +++++++++++++++++++ 3 files changed, 65 insertions(+), 37 deletions(-) create mode 100644 "problems/\354\213\240\352\263\240\352\262\260\352\263\274\353\260\233\352\270\260/solution1.js" diff --git "a/problems/\354\213\240\352\263\240\352\262\260\352\263\274\353\260\233\352\270\260/README.md" "b/problems/\354\213\240\352\263\240\352\262\260\352\263\274\353\260\233\352\270\260/README.md" index b353dc4..5d296d7 100644 --- "a/problems/\354\213\240\352\263\240\352\262\260\352\263\274\353\260\233\352\270\260/README.md" +++ "b/problems/\354\213\240\352\263\240\352\262\260\352\263\274\353\260\233\352\270\260/README.md" @@ -11,14 +11,14 @@ 유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다. **해결과정)** -report를 공백 기준으로 앞과 뒤를 나눈다. -report의 요소가 완전히 같은 건 제외. -1. 유저가 신고한 ID를 추려내 신고당한 횟수 확인 - report의 요소 중 완전히 같은 건 삭제한 배열 리턴 - id_list를 돌면서 id가 report 뒤 id(중복 제거 배열을 공백 기준으로 나누기)와 같을 경우, 해당 아이디의 신고당한 횟수 +1 해서 신고당한 횟수 배열 만들기 +1. report에서 중복 제거해 배열 리턴 -2. k번 이상일 때 정지된 ID 배열 만들기 +2. 신고당한 횟수 배열 만들기 + id_list.length만큼 0이 있는 배열 만들기 + report 공백 앞 문자열이 id_list에서 몇 번째 index에 있는지 확인하여, reportNumArr의 해당 index에 1을 더해준다. -3. id_list를 돌면서 결과메일 받을 id 확인하기 - id가 report 앞 id와 같을 때, report 뒤 id가 2.의 배열의 요소가 있는지 카운트 하기 +3. k번 이상일 때 정지된 ID 배열 만들기 + +4. id_list를 돌면서 결과메일 받을 id 확인하기 + 먼저 3.의 배열 안에 report 뒤 id가 있을 때 report 앞 id가 id_list의 몇 번째 index에 있는지 확인하고, receiveResultMailArr의 해당 index에 1을 더해준다. diff --git "a/problems/\354\213\240\352\263\240\352\262\260\352\263\274\353\260\233\352\270\260/solution.js" "b/problems/\354\213\240\352\263\240\352\262\260\352\263\274\353\260\233\352\270\260/solution.js" index e0e45e4..b38e9c1 100644 --- "a/problems/\354\213\240\352\263\240\352\262\260\352\263\274\353\260\233\352\270\260/solution.js" +++ "b/problems/\354\213\240\352\263\240\352\262\260\352\263\274\353\260\233\352\270\260/solution.js" @@ -1,43 +1,28 @@ function solution(id_list, report, k) { let answer = []; - const reportNumArr = []; // 신고당한 횟수 배열 - const suspensionIdArr = []; // 정지된 id 배열 - + const suspensionIdArr = []; //정지된 id 배열 //report에서 중복 제거하기 const removeRepeat = [...new Set(report)]; // 신고당한 횟수 배열 만들기 - id_list.forEach((id) => { - // id와 reportedId가 같을 때 해당 아이디 신고당한 횟수에 +1 - let reportedNum = 0; - removeRepeat.forEach((reportElement) => { - const [reportId, reportedId] = reportElement.split(" "); - if (reportedId !== id) return; - reportedNum++; - }); - // 단일 반복문으로 만들어야 함 -> 단일 반복문 뭐로? - // id를 돌리는 게 문제다 => report를 돌려서 저장해야한다. - // 걍 배열을 저장하는 방식이 틀림. - // 무작정 push가 아니라 빈배열이 아니라, index나 키로 접근해야함 - // id 업이도 돌아가는 방법을 생각해야함. - // 단지 시간초과 때문에 이생각 - // 여기서 틀린 것을 어떻게 고치는지 메모하기 - reportNumArr.push(reportedNum); + const reportNumArr = new Array(id_list.length).fill(0); + removeRepeat.forEach((reportElement) => { + //report 공백 앞 문자열이 id_list에서 몇 번째 index에 있는지 확인하여, reportNum의 해당 index에 1을 더해준다. + const [reportId, reportedId] = reportElement.split(" "); + reportNumArr[id_list.indexOf(reportedId)]++; }); // k번 이상일 때 정지된 ID 배열 만들기 reportNumArr.forEach((reportNum, idx) => { if (reportNum >= k) suspensionIdArr.push(id_list[idx]); }); // id_list를 돌면서 결과메일 받을 id 확인하기 - id_list.forEach((id) => { - let resultMailCount = 0; - removeRepeat.forEach((reportElement) => { - const [reportId, reportedId] = reportElement.split(" "); - if (reportId !== id) return; - if (!suspensionIdArr.includes(reportedId)) return; - resultMailCount++; - }); - answer.push(resultMailCount); + const receiveResultMailArr = new Array(id_list.length).fill(0); + removeRepeat.forEach((reportElement) => { + //먼저 3.의 배열 안에 report 뒤 id가 있을 때 report 앞 id가 id_list의 몇 번째 index에 있는지 확인하고, receiveResultMailArr의 해당 index에 1을 더해준다. + const [reportId, reportedId] = reportElement.split(" "); + if (!suspensionIdArr.includes(reportedId)) return; + receiveResultMailArr[id_list.indexOf(reportId)]++; }); - + // answer에 receiveResultMailArr 대입 + answer = receiveResultMailArr; return answer; } diff --git "a/problems/\354\213\240\352\263\240\352\262\260\352\263\274\353\260\233\352\270\260/solution1.js" "b/problems/\354\213\240\352\263\240\352\262\260\352\263\274\353\260\233\352\270\260/solution1.js" new file mode 100644 index 0000000..5e55f20 --- /dev/null +++ "b/problems/\354\213\240\352\263\240\352\262\260\352\263\274\353\260\233\352\270\260/solution1.js" @@ -0,0 +1,43 @@ +function solution(id_list, report, k) { + let answer = []; + const reportNumArr = []; // 신고당한 횟수 배열 + const suspensionIdArr = []; // 정지된 id 배열 + + //report에서 중복 제거하기 + const removeOverlapReport = [...new Set(report)]; + + // 신고당한 횟수 배열 + const reportedCountMap = new Map(); + id_list.forEach((id) => { + reportedCountMap.set( + id, + removeOverlapReport.filter((el) => { + const [reportId, reportedId] = el.split(" "); + return id === reportedId; + }).length + ); + }); + // k번 이상일 때 정지된 ID 배열 만들기 + const idSuspension = [...reportedCountMap.keys()].find((key) => { + reportedCountMap.get(key) >= k; + }); + console.log(idSuspension); + // k번 이상일 때 정지된 ID 배열 만들기 + reportNumArr.forEach((reportNum, idx) => { + if (reportNum >= k) suspensionIdArr.push(id_list[idx]); + }); + // k번 이상일 때 정지된 ID 배열 만들기 + // id_list를 돌면서 결과메일 받을 id 확인하기 + id_list.forEach((id) => { + let resultMailCount = 0; + removeOverlapReport.forEach((reportElement) => { + const [reportId, reportedId] = reportElement.split(" "); + if (reportId !== id) return; + if (!suspensionIdArr.includes(reportedId)) return; + resultMailCount++; + }); + answer.push(resultMailCount); + }); + + return answer; +} From 67822d91d54d5720b5ef445f251a4ee9823ecf45 Mon Sep 17 00:00:00 2001 From: Hennization Date: Thu, 9 Jun 2022 15:17:17 +0900 Subject: [PATCH 4/4] =?UTF-8?q?chore:=20=ED=8C=8C=EC=9D=BC=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solution1.js" | 43 ------------------- 1 file changed, 43 deletions(-) delete mode 100644 "problems/\354\213\240\352\263\240\352\262\260\352\263\274\353\260\233\352\270\260/solution1.js" diff --git "a/problems/\354\213\240\352\263\240\352\262\260\352\263\274\353\260\233\352\270\260/solution1.js" "b/problems/\354\213\240\352\263\240\352\262\260\352\263\274\353\260\233\352\270\260/solution1.js" deleted file mode 100644 index 5e55f20..0000000 --- "a/problems/\354\213\240\352\263\240\352\262\260\352\263\274\353\260\233\352\270\260/solution1.js" +++ /dev/null @@ -1,43 +0,0 @@ -function solution(id_list, report, k) { - let answer = []; - const reportNumArr = []; // 신고당한 횟수 배열 - const suspensionIdArr = []; // 정지된 id 배열 - - //report에서 중복 제거하기 - const removeOverlapReport = [...new Set(report)]; - - // 신고당한 횟수 배열 - const reportedCountMap = new Map(); - id_list.forEach((id) => { - reportedCountMap.set( - id, - removeOverlapReport.filter((el) => { - const [reportId, reportedId] = el.split(" "); - return id === reportedId; - }).length - ); - }); - // k번 이상일 때 정지된 ID 배열 만들기 - const idSuspension = [...reportedCountMap.keys()].find((key) => { - reportedCountMap.get(key) >= k; - }); - console.log(idSuspension); - // k번 이상일 때 정지된 ID 배열 만들기 - reportNumArr.forEach((reportNum, idx) => { - if (reportNum >= k) suspensionIdArr.push(id_list[idx]); - }); - // k번 이상일 때 정지된 ID 배열 만들기 - // id_list를 돌면서 결과메일 받을 id 확인하기 - id_list.forEach((id) => { - let resultMailCount = 0; - removeOverlapReport.forEach((reportElement) => { - const [reportId, reportedId] = reportElement.split(" "); - if (reportId !== id) return; - if (!suspensionIdArr.includes(reportedId)) return; - resultMailCount++; - }); - answer.push(resultMailCount); - }); - - return answer; -}