반응형
2021_07_18 문제 풀이
문제 URL : https://programmers.co.kr/learn/courses/30/lessons/17676?language=javascript
문제
의사코드
첫 코드 작성 전 작성한 수도코드이다.
// 최초 로그의 시작점을 가져온다 / {start} = getRangeDate(lines[0]);
// 마지막 로그의 끝점을 가져온다 / {end} = getRangeDate(lines[lines.length - 1]);
// unitCount = [];
// let logs = lines.map((log) => getRangeDate(log)) > 맵핑, 각 로그들의 start, last가 객체형식으로 담겨진 배열
// 최초 로그의 시작 시점부터 1ms 단위로 데이트를 추가하고 (기준) / 마지막 로그의 종료 시점까지
// >> new Date(start)
// 그 데이트를 기점으로 1000만큼씩 블록을 잡는다 (기준 ~ 기준 + 1s 범위)
// blockStart = 기존 데이트
// blockEnd = 기존 데이트 + 1000ms를 한 값
// 해당되는 로그를 찾는다
//어떻게?
// 경우
// 1. 로그의 시작점이 기준보다 작지만 로그의 끝점이 기준보다 큰 경우
// 2. 로그의 시작점이 기준보다 크지만 blockEnd보다 작은 경우
// 1, 2조건에 맞춘 값을 필터링한다.
// let validLogs = logs.filter((log) => (log.start < blockStart && log.end > blockstart) || (log.start > blockStart && log.start < blockEnd))
// validLogs.length를 unitCount 배열에 원소로 추가한다
// 최종적으로 unitCount에 있는 최댓값을 리턴한다
// !! 필요 데이터 가공 getRangeDate()
// T를 가공할 함수 선언 / 인자로 스트링 ("2016-09-15 20:59:57.421 0.351s") => date
// let tempDate = date.split(" "); 쪼개고 마지막 s를 땐 후 숫자로 변환 * 1000을 해서 밀리세컨드 폼으로 변경
// let start = new Date(`${tempDate[0] ${tempDate[1]}`);
// start.setMilliseconds(start.getMilliseconds() - 밀리세컨드)
// 시작점
// start = `${tempDate[0]} ${start.getHours}:${start.getMinutes()}:${start.getSeconds()}:${start:getMilliseconds()}`
// 끝점
// end = `${tempDate[0] ${tempDate[1]}`
// {start, end}
풀이
const getFormattingDate = (obj)=> `2016-09-15 ${obj.toTimeString().slice(0, 8)}.${String(obj.getMilliseconds() / 1000).slice(2)}`
function getRangeDate(log) {
const splitDate = log.split(" ");
const time = parseFloat(splitDate[2].replace("s", "")) * 1000;
let start = new Date(`${splitDate[0]} ${splitDate[1]}`);
start.setMilliseconds(start.getMilliseconds() - time + 1);
start = getFormattingDate(start)
let end = `${splitDate[0]} ${splitDate[1]}`
return {start, end};
}
function solution(lines) {
if (lines.length === 1) return 1;
let {start} = getRangeDate(lines[0]);
let {end} = getRangeDate(lines[lines.length - 1]);
let unitArray = [];
const logs = lines.map((log) => getRangeDate(log));
const needsLoopCount = new Date(end) - new Date(start);
for (let ms = 1; ms < needsLoopCount; ms++) {
const tempStart = new Date(start)
const tempEnd = new Date(start);
tempStart.setMilliseconds(tempStart.getMilliseconds() + ms);
tempEnd.setMilliseconds(tempStart.getMilliseconds() + 1000);
const blockStart = getFormattingDate(tempStart);
const blockEnd = getRangeDate(`${blockStart} 1s`).start
let validLogs = logs.filter((log) => (log.start < blockStart && log.end > blockStart) || (log.start > blockStart && log.start < blockEnd))
unitArray.push(validLogs.length);
}
return Math.max(...unitArray);
}
휴 도랏나 4시간 넘게 붙잡고 있을 줄은 몰랐다.
date 객체를 활용해 log의 범위를 구하고, 1000ms단위를 블럭으로 갖는 코드를 구현했는데
실패가 좌르륵
아무래도 포문안에서 1ms 단위마다 반복을 해야하는 문제도 있고, date 객체를 활용하면서 이게 맞나 싶었는데 아니었던 것 같다.
오랜시간 붙잡고 있다가 검색을 해보았는데 특별한 알고리즘 보다는 구현력의 문제였던 것 같아 코드를 읽진 않았다.
Date객체가 아닌 순수 로직으로 진행했어야 하는 게 큰 삽질의 이유이지 않을까 싶다............4시간..을 붙잡고있었는데 못 풀줄은 1도 몰랐..
결국 못풀어냈고 이걸 풀어낼때까지....다시 시도할 예정이다
반응형
'Algorithm > Algorithm Study' 카테고리의 다른 글
[프로그래머스] 2018 카카오 블라인드 _ [1차]뉴스 클러스터링 (0) | 2021.08.08 |
---|---|
[프로그래머스] 2020 카카오 인턴십 _ 수식 최대화 (도른자) (0) | 2021.08.08 |
[프로그래머스] 2019 카카오 인턴쉽 _ 크레인 인형뽑기 (0) | 2021.07.18 |
[프로그래머스] 2020 KAKAO 블라인드 _ 문자열 압축 (0) | 2021.07.11 |
[프로그래머스] 2019 KAKAO 블라인드 _ 오픈 채팅방 (0) | 2021.07.11 |