본문 바로가기

알고리즘/test

javascript) 프로그래머스 - 호텔 대실

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

 

프로그래머스

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

programmers.co.kr

실행코드

function solution(book_time) {
  // 시작 시간 순으로 정렬해줍니다.
  book_time.sort();

  // 종료 시간이 들어갈 배열
  const room = [];

  // forEach를 통해 하나씩 확인해줍니다.
  book_time.forEach((t) => {
    // split() 메서드를 이용해 시간을 분리해준다.
    const tmp = t[0].split(":");

    // 문자열 시간을 숫자로 변환한다.
    const startTime = Number(tmp[0]) * 60 + Number(tmp[1]);

    // times 배열에서 시작 시간과 같거나 시작 시간보다 작은 수를 찾는다.
    const idx = room.findIndex((e) => e <= startTime);

    // 만약 없다면 room을 추가하고 새로운 종료시간을 넣어준다.
    if (idx === -1) room.push(getNextTime(t[1]));
    // 만약 있다면 기존 room의 종료시간을 변경해준다.
    else room[idx] = getNextTime(t[1]);
  });

  // room의 갯수를 리턴해준다.
  return room.length;
}

// 다음 이용 가능 시간을 리턴해주는 함수
function getNextTime(endTime) {
  // split() 메서드를 이용해 시간을 분리해준다.
  const next = endTime.split(":");

  // 문자열 시간은 숫자로 변환해서 리턴해준다.
  // 종료 시간 + 10을 해서 다음 이용 가능 시간을 리턴해준다.
  // ex) => "19:20" => 1,170
  return Number(next[0]) * 60 + Number(next[1]) + 10;
}

풀이:

solution 함수는 book_time 배열을 사용하며 여기서 각 요소는 회의 시작 및 종료 시간 쌍입니다. 이 함수는 탐욕적인 접근 방식을 사용하고 시작 시간을 기준으로 배열을 정렬합니다. 그런 다음 room이라는 배열을 사용하여 각 회의실에서 현재 예약된 회의의 종료 시간을 추적합니다.

forEach 메서드는 반복하는 데 사용됩니다. 정렬된 book_time 배열에 대해. 각 회의에 대해 시작 시간이 추출되고 Number() 및 산술 연산을 사용하여 분으로 변환됩니다. findIndex 메서드는 room 배열에서 시작 시간보다 작거나 같은 첫 번째 요소의 인덱스를 찾는 데 사용됩니다. 해당 요소가 없으면 room에 새로운 방이 추가되고 회의 종료 시간이 삽입됩니다. 그렇지 않으면 회의 종료 시간이 기존 회의실에 대해 업데이트됩니다.

getNextTime 함수는 회의 종료 후 다음 사용 가능한 시간을 계산하는 데 사용됩니다. "hh:mm" 형식의 종료 시간이 걸리며 split 메서드를 사용하여 시간과 분으로 나눕니다. 그런 다음 시간과 분은 Number()를 사용하여 분으로 변환되고 10을 더하여 다음 사용 가능한 시간을 반환합니다.