프로그래머스 호텔 대실 문제 - 타임라인 배열로 예약 겹치는 예약 수 계산하기 Java 풀이

2025. 2. 23. 19:36·코딩 테스트 풀이

문제 설명

프로그래머스 호텔 대실 문제

 

https://school.programmers.co.kr/learn/courses/30/lessons/155651?language=java

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

문제 접근

  • 시작 시간과 종료 시간을 바탕으로 하루 동안 겹치는 예약의 최대 개수를 찾아내야한다.
  • 예약시간을 HH:MM에서 MM으로 변경하고 그걸 배열 인덱스로 활용하여 시작 시간에 +1, 종료 시간에는 -1을 기록한다.
  • 예약 겹침 시간 계산: 시작, 종료시간을 기록한 배열을 순차 탐색하며 누적 합을 계산하면 된다.

예약 겹침 시간 계산하는 부분

        // 타임라인을 사용하여 예약이 겹치는 시간 계산
        int[] timeline = new int[1440 + 10]; // 하루는 최대 1440분, 청소 시간을 고려하여 여유를 둠

        // 각 예약에 대해 시작 시간과 종료 시간에 타임라인 변화 기록
        for (int[] time : times) {
            int start = time[0]; // 시작 시간
            int end = time[1];   // 종료 시간 (청소시간 포함)

            // 시작 시점 +1, 종료 시점 -1
            timeline[start]++;
            timeline[end]--;
        }

        // 타임라인을 바탕으로 겹치는 예약의 최대 개수 찾기
        int maxOverlap = 0;
        int currentOverlap = 0;

        for (int i = 0; i < 1440; i++) {
            currentOverlap += timeline[i]; // 겹치는 예약 수 계산
            maxOverlap = Math.max(currentOverlap, maxOverlap); // 최대 겹치는 예약 수 찾기
        }

전체 코드

class Solution {
    public int solution(String[][] book_time) {
        int answer = 0;
        int row = book_time.length;
        int[][] times = new int[row][2];
        
        for(int i = 0; i < row; i++) {
            for (int j = 0; j < 2; j++) {
                String[] timeParts = book_time[i][j].split(":");
                int hours = Integer.parseInt(timeParts[0]);
                int minutes = Integer.parseInt(timeParts[1]);
                
                if (j == 1) {
                    times[i][j] = hours * 60 + minutes + 10; // 청소 시간 고려    
                } else {
                    times[i][j] = hours * 60 + minutes;
                }
            }
        }
        
        int[] timeline = new int[1440 + 10]; //하루는 최대 1440분 + 청소 시간 10분 추가
        
        for (int[] time : times) {
            int start = time[0];
            int end = time[1];
            
            timeline[start]++;
            timeline[end]--;
        }
        
        int maxOverlap = 0;
        int currentOverlap = 0;
        
        for (int i = 0; i < 1440; i++) {
            currentOverlap += timeline[i];
            maxOverlap = Math.max(currentOverlap, maxOverlap);
        }
        return maxOverlap;
    }
}

 

'코딩 테스트 풀이' 카테고리의 다른 글

최대 부분합 문제의 응용 - 연속 펄스 부분 수열의 합 - 카데인 알고리즘(Kadane's Algorithm)  (0) 2025.02.01
부분 수열의 탐색 문제 - 연속된 부분 수열의 합 - 투포인터 알고리즘(Two-Pointer Algorithm)  (0) 2025.02.01
'코딩 테스트 풀이' 카테고리의 다른 글
  • 최대 부분합 문제의 응용 - 연속 펄스 부분 수열의 합 - 카데인 알고리즘(Kadane's Algorithm)
  • 부분 수열의 탐색 문제 - 연속된 부분 수열의 합 - 투포인터 알고리즘(Two-Pointer Algorithm)
leequiett
leequiett
개발 블로그입니다. 벨로그에서 이사중입니다~
  • leequiett
    leequiett의 개발 블로그
    leequiett
  • 전체
    오늘
    어제
    • 분류 전체보기 (57)
      • 코딩 테스트 풀이 (3)
      • 알고리즘 (9)
        • 정렬 (3)
        • 탐색 (4)
      • 자료구조 (5)
      • 운영체제 (7)
      • 네트워크 (5)
      • 보안, 해킹 (1)
        • 리버싱, Exploit (5)
      • 개발 환경, 팁 (11)
      • 프론트엔드 (1)
      • 프로그래밍 언어 (4)
        • Java (4)
        • C (0)
      • 일상 (4)
      • 티스토리 꾸미기 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    출연연
    NCS
    취업
    자격증
    농협
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
leequiett
프로그래머스 호텔 대실 문제 - 타임라인 배열로 예약 겹치는 예약 수 계산하기 Java 풀이
상단으로

티스토리툴바