카테고리 없음

프로그래머스_호텔 대실(Java)

O'bin 2023. 7. 21. 12:10

누적합 (Cumulative Sum)

주어진 배열 또는 리스트의 각 요소까지의 누적된 합을 구하는 것

누적합은 배열의 원소를 한 번씩 순회하며 이전 요소들까지의 합을 누적하여 저장하는 방식으로 계산

이렇게 누적된 합을 이용하면 배열 내의 어떤 부분 배열의 합을 빠르게 계산할 수 있음

 

예) 원본 배열: [1, 2, 3, 4, 5]            누적합: [1, 3, 6, 10, 15]

 

누적합 시간복잡도 : 배열의 길이가 N일 때 O(N)


프로그래밍에서는 주로 누적합을 이용하여 특정 구간의 합을 빠르게 구하는 등의 연산에 활용

누적합을 사용하면 반복적으로 부분 배열 합을 계산하는 경우에 비해 더 효율적인 알고리즘을 설계할 수 있음

 

 

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

 

프로그래머스

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

programmers.co.kr

 

 

내 답안 : 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Solution {
    //고정 상수 선언
    private static final int MAX_TIME = 1450;    
    //1440(60분*24시간)+10(청소시간)
    private static final int HOUR = 60;
    private static final int TIME_FOR_CLEANING = 10;
    
    //예약 시간을 분 단위로 변환
    private static int calTime(String time) {
        String[] split = time.split(":");
        int hour = Integer.parseInt(split[0]) * 60;
        int min = Integer.parseInt(split[1]);
        return hour + min;
    }
 
    public int solution(String[][] book_time) {
        int answer = 0;
 
        int[] room = new int[MAX_TIME];
        
        //for each문 : for(type var : iterate)
        for (String[] time : book_time) {
            String inputTime = time[0];
            String outputTime = time[1];
            
            // 겹치는 예약 수 누적 계산
            room[calTime(inputTime)] += 1;
            room[calTime(outputTime) + TIME_FOR_CLEANING] -= 1;
        }
 
        // 가장 큰 room[i] 값이 필요한 방의 최대 갯수
        for (int i = 1; i < MAX_TIME; i++) {
            room[i] += room[i - 1];
            answer = Math.max(answer, room[i]);
        }
        return answer;
    }
}
cs

 

시간복잡도 :  O(N) (N = book_time 배열의 크기) 

 

 

이 문제의 경우 누적합으로 풀이하는 것이 가장 속도가 빠름