KimMinJun
Coding Note
KimMinJun
전체 방문자
오늘
어제
  • 분류 전체보기 (487)
    • ALGORITHM (11)
      • 정렬 (6)
      • 최단경로 (1)
      • 자료구조 (1)
      • 슬라이딩 윈도우 (1)
      • etc (2)
    • Git (5)
    • Web (24)
      • Vanilla JS (13)
      • TS (2)
      • React (7)
      • ETC (1)
    • React 공식문서 (번역, 공부) (11)
      • Quick Start (2)
      • Installation (0)
      • Describing the UI (9)
      • Adding Interactivity (0)
      • Managing State (0)
      • Escape Hatches (0)
    • Next.js 공식문서 (번역, 공부) (3)
      • Getting Started (2)
      • Building Your Application (1)
    • PS (432)
      • 백준 (187)
      • Programmers (105)
      • CodeUp (21)
      • STL (3)
      • 제코베 JS 100제 (50)
      • SWEA (0)
      • LeetCode (65)
    • IT (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 관리

공지사항

인기 글

태그

  • LeetCode
  • Level 1
  • js
  • recursion
  • 정렬
  • Level 0
  • C
  • codeup
  • tree
  • 문자열
  • 수학
  • Level 2
  • 그래프
  • programmers
  • C++
  • 제코베 JS 100제
  • string
  • 백준
  • Level1
  • 다이나믹 프로그래밍

최근 댓글

최근 글

hELLO · Designed By 정상우.
KimMinJun

Coding Note

PS/Programmers

Programmers / Level 2 / 호텔 대실 / JS

2024. 7. 10. 20:25

문제 간단설명

예약한 [대실 시작 시각, 대실 종료 시각] 의 배열이 담겨있는 2차원 배열이 주어진다.

한 방이 사용중이라면, 퇴실 시간 이후에 10분의 청소 시간을 가진 후에 다른 사람이 사용할 수 있다.

이럴 경우 최소 몇 개의 방이 있어야 모든 예약을 받을 수 있는지 반환하는 문제이다.

 

제한 사항

  • 1 <= book_time의 길이 <= 1,000
    • book_time[i]는 ["HH:MM", "HH:MM"]의 형태로 이루어진 배열
      • [대실 시작 시각, 대실 종료 시각]을 나타냄
    • 시각은 HH:MM의 형태로 24시간 표기법을 따르며, "00:00"부터 "23:59" 까지로 주어짐
      • 예약 시각이 자정을 넘어가는 경우는 없음
      • 시작 시각은 항상 종료 시각보다 빠름

 

성공 코드

function solution(book_time) {
  /**
   * 시간 문자열을 분으로 바꿔주는 함수이다.
   *
   * @param {string} time hh:mm 형식의 시간 문자열
   * @returns 분으로 치환한 정수
   */
  const covertToMinutes = (time) => {
    const [hours, minutes] = time.split(':').map(Number);

    return hours * 60 + minutes;
  };

  const bookMinuteList = [...book_time].map((time) => {
    const [start, end] = time;

    // 정리 시간 10분까지 미리 더해준다.
    return [covertToMinutes(start), covertToMinutes(end) + 10];
  });

  // 시작 시간 기준으로 오름차순 정렬한다.
  bookMinuteList.sort((a, b) => a[0] - b[0]);

  const roomList = [];
  for (const [start, end] of bookMinuteList) {
    // 비어있는 방의 인덱스를 찾는다.
    const emptyRoomIndex = roomList.findIndex((room) => room <= start);

    // 만약 비어있는 방이 없다면 새로운 방을 추가한다.
    if (emptyRoomIndex === -1) {
      roomList.push(end);
    } else {
      // 만약 방이 있다면, 퇴실 시간을 갱신한다.
      roomList[emptyRoomIndex] = end;
    }
  }

  return roomList.length;
}

 

이 문제는 대실 시작시간으로 정렬하는 것이 키포인트인 것 같다.

정렬한 리스트를 순회하면서, 현재 순회중인 대실 시작 시간으로 바로 들어갈 수 있는 방이 있다면, 그 인덱스에 해당하는 방의 대실 종료 시각을 현재 순회중인 종료 시각으로 갱신해준다.

 

만약 들어갈 수 있는 방이 없다면 새로운 방이 필요하므로 현재 순회중인 종료 시각을 리스트에 push 해준다.

 

그리고 마지막에 roomList 배열의 길이가 곧 방의 개수이므로 길이를 반환해주면 된다.

저작자표시 (새창열림)

'PS > Programmers' 카테고리의 다른 글

Programmers / Level 2 / 배달 / JS  (0) 2024.07.12
Programmers / Level 2 / 숫자 카드 나누기 / JS  (0) 2024.07.10
Programmers / Level 2 / 쿼드압축 후 개수 세기 / JS  (0) 2024.07.06
Programmers / Level 2 / 2개 이하로 다른 비트 / JS  (0) 2024.07.05
    'PS/Programmers' 카테고리의 다른 글
    • Programmers / Level 2 / 배달 / JS
    • Programmers / Level 2 / 숫자 카드 나누기 / JS
    • Programmers / Level 2 / 쿼드압축 후 개수 세기 / JS
    • Programmers / Level 2 / 2개 이하로 다른 비트 / JS
    KimMinJun
    KimMinJun

    티스토리툴바