반응형
250x250
Notice
Recent Posts
Recent Comments
Link
관리 메뉴

짧은코딩

프로그래머스) 광고 삽입 본문

코딩테스트 with JS/백준, 프로그래머스

프로그래머스) 광고 삽입

5_hyun 2023. 3. 4. 00:20

-문제 사이트

https://school.programmers.co.kr/learn/courses/30/lessons/72414

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

코드

function solution(play_time, adv_time, logs) {
  let pt = calSecond(play_time);
  let at = calSecond(adv_time);
  let times = Array(pt).fill(0);

  for (let log of logs) {
    let temp = log.split("-");
    let s = calSecond(temp[0]);
    let e = calSecond(temp[1]);

    times[s]++;
    times[e]--;
  }

  // 동시 접속자 수
  for (let i = 1; i < pt; i++) times[i] += times[i - 1];
  // 누적 접속자 수
  for (let i = 1; i < pt; i++) times[i] += times[i - 1];

  let point = 0;
  let sum = times[at - 1];
  for (let i = at; i < pt; i++) {
    if (sum < times[i] - times[i - at]) {
      sum = times[i] - times[i - at];
      point = i - at + 1;
    }
  }

  return makeTime(point);
}

function calSecond(hour) {
  let time;
  let temp = hour.split(":").map(Number);

  time = temp[0] * 3600 + temp[1] * 60 + temp[2];
  return time;
}

function makeTime(second) {
  let hour = Math.floor(second / 3600);
  second %= 3600;
  let min = Math.floor(second / 60);
  let sec = second % 60;

  hour < 10 ? (hour = "0" + hour) : "";
  min < 10 ? (min = "0" + min) : "";
  sec < 10 ? (sec = "0" + sec) : "";

  return `${hour}:${min}:${sec}`;
}

해결 방법

이 문제는 여러운 알고리즘을 필요로 하기보단 생각을 많이 해야 하는 문제라고 생각한다. 아직 이런 문제를 푸는 스킬이 부족한 거 같아서 더 많은 문제를 풀어봐야겠다고 느꼈다. 우선 시간을 초로 바꿔주는 calSecond 함수와 초를 시간 단위로 바꿔주는 makeTime 함수를 만들었다.

 

  let pt = calSecond(play_time);
  let at = calSecond(adv_time);
  let times = Array(pt).fill(0);

  for (let log of logs) {
    let temp = log.split("-");
    let s = calSecond(temp[0]);
    let e = calSecond(temp[1]);

    times[s]++;
    times[e]--;
  }

이 부분에는 times에 각 시간대별로 사람이 영상을 보면 +1, 안보면 -1을 해줬다. 따라서 times에는 그 시간대에 들어온 사람과 나간 사람을 카운팅 한 것이다.

 

  // 동시 접속자 수
  for (let i = 1; i < pt; i++) times[i] += times[i - 1];
  // 누적 접속자 수
  for (let i = 1; i < pt; i++) times[i] += times[i - 1];

이 부분에선 처음에 동시 접속자 수를 구했다. 그리고 for문을 한 번 더 돌면 누적 접속자 수를 구할 수 있다.

 

  let point = 0;
  let sum = times[at - 1];
  for (let i = at; i < pt; i++) {
    if (sum < times[i] - times[i - at]) {
      sum = times[i] - times[i - at];
      point = i - at + 1;
    }
  }

  return makeTime(point);

point에 누적 접속자 수가 많은 시간을 저장하고 sum에 최대 누적 접속자 수를 저장하여 답을 구했다.

 

-출처

https://velog.io/@longroadhome/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-LV.3-%EA%B4%91%EA%B3%A0-%EC%82%BD%EC%9E%85-JS

 

[프로그래머스] LV.3 광고 삽입 (JS)

카카오TV에서 유명한 크리에이터로 활동 중인 죠르디는 환경 단체로부터 자신의 가장 인기있는 동영상에 지구온난화의 심각성을 알리기 위한 공익광고를 넣어 달라는 요청을 받았습니다. 평소

velog.io

 

728x90
반응형
Comments