From 37f1b5916fc061a98a6f23c91b40b15f19dac14a Mon Sep 17 00:00:00 2001 From: Seungrok Date: Mon, 16 May 2022 10:01:47 +0900 Subject: [PATCH 1/3] =?UTF-8?q?add:=202022-05-15=20=EA=B4=91=EA=B3=A0=20?= =?UTF-8?q?=EC=82=BD=EC=9E=85=201=EC=B0=A8=20=EB=AC=B8=EC=A0=9C=ED=92=80?= =?UTF-8?q?=EC=9D=B4=20(=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=BC=80=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=EB=8A=94=20=ED=86=B5=EA=B3=BC,=20=EC=A0=95=ED=95=A9?= =?UTF-8?q?=EC=84=B1=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=8B=A4=ED=8C=A8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...21\352\263\240\354\202\275\354\236\205.js" | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 "\354\231\204\354\240\204\355\203\220\354\203\211/PG_\352\264\221\352\263\240\354\202\275\354\236\205.js" diff --git "a/\354\231\204\354\240\204\355\203\220\354\203\211/PG_\352\264\221\352\263\240\354\202\275\354\236\205.js" "b/\354\231\204\354\240\204\355\203\220\354\203\211/PG_\352\264\221\352\263\240\354\202\275\354\236\205.js" new file mode 100644 index 0000000..6b85bdc --- /dev/null +++ "b/\354\231\204\354\240\204\355\203\220\354\203\211/PG_\352\264\221\352\263\240\354\202\275\354\236\205.js" @@ -0,0 +1,53 @@ +const toSeconds = (time) => { + return time.split(':').reduce((prev, curr) => prev * 60 + curr * 1, 0) +} + +function solution(play_time, adv_time, logs) { + var answer = '' + const playSec = toSeconds(play_time) + const advSec = toSeconds(adv_time) + const timeSet = new Set() + timeSet.add('0-00:00:00') + timeSet.add(`${playSec}-${play_time}`) + logs = logs.map((log) => { + const [startLog, endLog] = log.split('-') + const [startT, endT] = [startLog, endLog].map(toSeconds) + timeSet.add(`${startT}-${startLog}`) + timeSet.add(`${endT}-${endLog}`) + return [startT, endT, log] + }) + logs.sort((a, b) => a[0] - b[0]) + const timeList = [...timeSet].map((el) => { + const [time, log] = el.split('-') + return [Number(time), log] + }) + timeList.sort((a, b) => a[0] - b[0]) + let maxAdvTime = 0 + timeList.forEach((el) => { + const startTime = el[0] + const endTime = startTime + advSec + let accAdvTime = 0 + logs.forEach((log) => { + const [logStart, logEnd] = log + if ( + logStart <= startTime && + startTime <= logEnd && + logStart <= endTime && + endTime <= logEnd + ) { + accAdvTime += advSec + } else if (logStart <= startTime && startTime <= logEnd) { + accAdvTime += logEnd - startTime + 1 + } else if (logStart <= endTime && endTime <= logEnd) { + accAdvTime += endTime - logStart + 1 + } else if (startTime < logStart && logEnd < endTime) { + accAdvTime += logEnd - logStart + 1 + } + }) + if (maxAdvTime < accAdvTime) { + maxAdvTime = accAdvTime + answer = el[1] + } + }) + return answer +} From 0fc254debb2477c147c8116ef5750ed567471b65 Mon Sep 17 00:00:00 2001 From: Seungrok Date: Mon, 16 May 2022 14:48:27 +0900 Subject: [PATCH 2/3] =?UTF-8?q?add:=202022-05-16=20=EA=B4=91=EA=B3=A0=20?= =?UTF-8?q?=EC=82=BD=EC=9E=85=202=EC=B0=A8=20=EB=AC=B8=EC=A0=9C=ED=92=80?= =?UTF-8?q?=EC=9D=B4(=EB=AC=B8=EC=A0=9C=ED=95=B4=EA=B2=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...21\352\263\240\354\202\275\354\236\205.js" | 82 +++++++++---------- 1 file changed, 39 insertions(+), 43 deletions(-) diff --git "a/\354\231\204\354\240\204\355\203\220\354\203\211/PG_\352\264\221\352\263\240\354\202\275\354\236\205.js" "b/\354\231\204\354\240\204\355\203\220\354\203\211/PG_\352\264\221\352\263\240\354\202\275\354\236\205.js" index 6b85bdc..492835e 100644 --- "a/\354\231\204\354\240\204\355\203\220\354\203\211/PG_\352\264\221\352\263\240\354\202\275\354\236\205.js" +++ "b/\354\231\204\354\240\204\355\203\220\354\203\211/PG_\352\264\221\352\263\240\354\202\275\354\236\205.js" @@ -2,52 +2,48 @@ const toSeconds = (time) => { return time.split(':').reduce((prev, curr) => prev * 60 + curr * 1, 0) } +const toHHMMSS = (sec) => { + const HH = Math.floor(sec / 3600) > 9 ? '' + Math.floor(sec / 3600) : '0' + Math.floor(sec / 3600) + const MM = + Math.floor((sec % 3600) / 60) > 9 + ? '' + Math.floor((sec % 3600) / 60) + : '0' + Math.floor((sec % 3600) / 60) + const SS = (sec % 3600) % 60 > 9 ? '' + ((sec % 3600) % 60) : '0' + ((sec % 3600) % 60) + return `${HH}:${MM}:${SS}` +} + function solution(play_time, adv_time, logs) { var answer = '' - const playSec = toSeconds(play_time) - const advSec = toSeconds(adv_time) - const timeSet = new Set() - timeSet.add('0-00:00:00') - timeSet.add(`${playSec}-${play_time}`) - logs = logs.map((log) => { - const [startLog, endLog] = log.split('-') - const [startT, endT] = [startLog, endLog].map(toSeconds) - timeSet.add(`${startT}-${startLog}`) - timeSet.add(`${endT}-${endLog}`) - return [startT, endT, log] + const playTime = toSeconds(play_time) + const advTime = toSeconds(adv_time) + //imosArr에 누적합 변화율을 O(1)시간으로 저장을 해놓고, 누적합을 저장하는 dp를 통해 누적합 구할 때 O(1)만에 구할 수 있도록 합니다. + const imosArr = new Array(playTime + 1).fill(0) + const dp = new Array(playTime + 1).fill(0) + //imos 채우기 + logs.forEach((log) => { + const [startTime, endTime] = log.split('-').map(toSeconds) + imosArr[startTime]++ + imosArr[endTime]-- }) - logs.sort((a, b) => a[0] - b[0]) - const timeList = [...timeSet].map((el) => { - const [time, log] = el.split('-') - return [Number(time), log] - }) - timeList.sort((a, b) => a[0] - b[0]) - let maxAdvTime = 0 - timeList.forEach((el) => { - const startTime = el[0] - const endTime = startTime + advSec - let accAdvTime = 0 - logs.forEach((log) => { - const [logStart, logEnd] = log - if ( - logStart <= startTime && - startTime <= logEnd && - logStart <= endTime && - endTime <= logEnd - ) { - accAdvTime += advSec - } else if (logStart <= startTime && startTime <= logEnd) { - accAdvTime += logEnd - startTime + 1 - } else if (logStart <= endTime && endTime <= logEnd) { - accAdvTime += endTime - logStart + 1 - } else if (startTime < logStart && logEnd < endTime) { - accAdvTime += logEnd - logStart + 1 - } - }) - if (maxAdvTime < accAdvTime) { - maxAdvTime = accAdvTime - answer = el[1] + //imosArr, dp 채우기 + dp[0] = imosArr[0] + for (let i = 1; i < playTime + 1; i++) { + imosArr[i] = imosArr[i] + imosArr[i - 1] + dp[i] = dp[i - 1] + imosArr[i] + } + //dp에서 순회하며 찾아보기 최대 누적 시청자 수인 구간을 찾기 + let theEarlestStartTime = 0 + let maxAcc = dp[advTime] + for (let i = advTime - 1; i < imosArr.length; i++) { + const advEnd = i + const advStart = i - advTime + 1 //이래야 advStart+1 부터 advEnd까지 합해서 i 간격이 됨 + const acc = dp[advEnd] - dp[advStart - 1] + if (acc > maxAcc) { + theEarlestStartTime = advStart + maxAcc = acc } - }) + } + console.log(theEarlestStartTime) + answer = toHHMMSS(theEarlestStartTime) return answer } From 262032926e8b619128a93c7747348143004587ca Mon Sep 17 00:00:00 2001 From: Seungrok Date: Mon, 16 May 2022 14:59:01 +0900 Subject: [PATCH 3/3] =?UTF-8?q?refactor:=20=EB=B3=80=EC=88=98=EB=AA=85=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=EC=9D=84=20=ED=86=B5=ED=95=9C=20=EA=B0=80?= =?UTF-8?q?=EB=8F=85=EC=84=B1=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...21\352\263\240\354\202\275\354\236\205.js" | 37 +++++++++---------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git "a/\354\231\204\354\240\204\355\203\220\354\203\211/PG_\352\264\221\352\263\240\354\202\275\354\236\205.js" "b/\354\231\204\354\240\204\355\203\220\354\203\211/PG_\352\264\221\352\263\240\354\202\275\354\236\205.js" index 492835e..106dd90 100644 --- "a/\354\231\204\354\240\204\355\203\220\354\203\211/PG_\352\264\221\352\263\240\354\202\275\354\236\205.js" +++ "b/\354\231\204\354\240\204\355\203\220\354\203\211/PG_\352\264\221\352\263\240\354\202\275\354\236\205.js" @@ -16,34 +16,33 @@ function solution(play_time, adv_time, logs) { var answer = '' const playTime = toSeconds(play_time) const advTime = toSeconds(adv_time) - //imosArr에 누적합 변화율을 O(1)시간으로 저장을 해놓고, 누적합을 저장하는 dp를 통해 누적합 구할 때 O(1)만에 구할 수 있도록 합니다. - const imosArr = new Array(playTime + 1).fill(0) - const dp = new Array(playTime + 1).fill(0) + //imos에 누적합 변화율을 O(1)시간으로 저장을 해놓고, O(n)시간에 누적합을 구한다. + //imos의 누적합을 저장하는 dp를 통해 누적합 구할 때 구간의 누적합을 O(1)만에 구할 수 있도록 합니다. + const imosDP = new Array(playTime + 1).fill(0) + const sumDP = new Array(playTime + 1).fill(0) //imos 채우기 logs.forEach((log) => { const [startTime, endTime] = log.split('-').map(toSeconds) - imosArr[startTime]++ - imosArr[endTime]-- + imosDP[startTime]++ + imosDP[endTime]-- }) - //imosArr, dp 채우기 - dp[0] = imosArr[0] + //imosDP, sumDP 채우기 + sumDP[0] = imosDP[0] for (let i = 1; i < playTime + 1; i++) { - imosArr[i] = imosArr[i] + imosArr[i - 1] - dp[i] = dp[i - 1] + imosArr[i] + imosDP[i] = imosDP[i - 1] + imosDP[i] + sumDP[i] = sumDP[i - 1] + imosDP[i] } - //dp에서 순회하며 찾아보기 최대 누적 시청자 수인 구간을 찾기 + //구간의 누적합을 찾아보면서 최대 누적 시청자수 지점의 최초 지점을 기록 let theEarlestStartTime = 0 - let maxAcc = dp[advTime] - for (let i = advTime - 1; i < imosArr.length; i++) { - const advEnd = i - const advStart = i - advTime + 1 //이래야 advStart+1 부터 advEnd까지 합해서 i 간격이 됨 - const acc = dp[advEnd] - dp[advStart - 1] - if (acc > maxAcc) { - theEarlestStartTime = advStart - maxAcc = acc + let maxSum = sumDP[advTime] + for (let adEnd = advTime - 1; adEnd < imosDP.length; adEnd++) { + const adStart = adEnd - advTime + 1 + const subSum = sumDP[adEnd] - sumDP[adStart - 1] + if (subSum > maxSum) { + theEarlestStartTime = adStart + maxSum = subSum } } - console.log(theEarlestStartTime) answer = toHHMMSS(theEarlestStartTime) return answer }