Lv 3. κ΄‘κ³  μ‚½μž…

2025. 4. 3. 20:45Β·Algorithm & Data Structures/Programers

 

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

 

 

πŸ“Œ μžλ°”(Java)둜 ν‘ΈλŠ” κ΄‘κ³  μ‚½μž… 문제 - ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ πŸ“ΊπŸ“Š


πŸ”Ž 문제 κ°œμš”

 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ Lv.3 - κ΄‘κ³  μ‚½μž… λ¬Έμ œμž…λ‹ˆλ‹€.

ν•˜λ£¨ λ™μ•ˆμ˜ λ™μ˜μƒ μž¬μƒ 기둝(logs)이 μ£Όμ–΄μ‘Œμ„ λ•Œ,

κ΄‘κ³ λ₯Ό μ‚½μž…ν•  μ‹œμž‘ μ‹œκ°„μ„ μ •ν•΄μ„œ, 전체 κ΄‘κ³  λˆ„μ  μ‹œμ²­ μ‹œκ°„μ„ μ΅œλŒ€ν™”ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.


πŸ’‘ 예제 μž…λ ₯

play_time = "02:03:55"
adv_time = "00:14:15"
logs = [
  "01:20:15-01:45:14",
  "00:40:31-01:00:00",
  ...
]

πŸ’‘ 예제 좜λ ₯

"01:30:59"

➑ ν•΄λ‹Ή μ‹œκ°μ— κ΄‘κ³ λ₯Ό μ‚½μž…ν–ˆμ„ λ•Œ κ΄‘κ³  λˆ„μ  μ‹œμ²­ μ‹œκ°„μ΄ μ΅œλŒ€κ°€ λ˜λŠ” μ‹œκ°μ„ λ°˜ν™˜


πŸ›  μ•Œκ³ λ¦¬μ¦˜ μ ‘κ·Ό 방식

 

이 λ¬Έμ œλŠ” λˆ„μ ν•©(Prefix Sum) + μŠ¬λΌμ΄λ”© μœˆλ„μš° 기법을 ν™œμš©ν•˜μ—¬ ν•΄κ²°ν•©λ‹ˆλ‹€.

 

✏️ 핡심 μ „λž΅

• μ‹œκ°„ λ‹¨μœ„λ₯Ό 초 λ‹¨μœ„λ‘œ λ³€ν™˜ν•˜μ—¬ λ°°μ—΄ 인덱슀둜 ν™œμš©

• viewers[i]: iμ΄ˆμ— μ‹œμ²­ 쀑인 μ‚¬λžŒ 수

• 둜그λ₯Ό 톡해 μ‹œμ²­μž 수 λ³€ν™”λ₯Ό 기둝 (μ‹œμž‘ μ‹œ +1, μ’…λ£Œ μ‹œ -1)

• 두 번 λˆ„μ ν•©:

1. λˆ„μ  μ‹œμ²­μž 수

2. λˆ„μ  μ‹œμ²­ μ‹œκ°„

• μŠ¬λΌμ΄λ”© μœˆλ„μš°λ‘œ κ΄‘κ³  길이만큼 ꡬ간을 μˆœνšŒν•˜λ©° μ΅œλŒ€ μ‹œμ²­ μ‹œκ°„ ꡬ간 μ°ΎκΈ°

 


πŸ”Ή Java μ½”λ“œ ν•΄μ„€

import java.util.*;

class Solution {
    public String solution(String play_time, String adv_time, String[] logs) {
        int playLength = toSeconds(play_time);
        int advLength = toSeconds(adv_time);

        long[] viewers = new long[playLength + 2];  // 1초 λ‹¨μœ„ λˆ„μ 

        for (String log : logs) {
            int start = toSeconds(log.substring(0, 8));
            int end = toSeconds(log.substring(9, 17));
            viewers[start] += 1;
            viewers[end] -= 1;
        }

        // 1μ°¨ λˆ„μ ν•©: μ΄ˆλ‹Ή μ‹œμ²­μž 수
        for (int i = 1; i <= playLength; i++) {
            viewers[i] += viewers[i - 1];
        }

        // 2μ°¨ λˆ„μ ν•©: μ‹œμ²­μž 수의 λˆ„μ ν•© = λˆ„μ  μ‹œμ²­ μ‹œκ°„
        for (int i = 1; i <= playLength; i++) {
            viewers[i] += viewers[i - 1];
        }

        long maxViewTime = viewers[advLength - 1];
        int answerTime = 0;

        for (int i = advLength; i <= playLength; i++) {
            long viewTime = viewers[i] - viewers[i - advLength];
            if (viewTime > maxViewTime) {
                maxViewTime = viewTime;
                answerTime = i - advLength + 1;
            }
        }

        return toTime(answerTime);
    }

    private int toSeconds(String time) {
        int h = Integer.parseInt(time.substring(0, 2));
        int m = Integer.parseInt(time.substring(3, 5));
        int s = Integer.parseInt(time.substring(6, 8));
        return h * 3600 + m * 60 + s;
    }

    private String toTime(int seconds) {
        int h = seconds / 3600;
        int m = (seconds % 3600) / 60;
        int s = seconds % 60;
        return String.format("%02d:%02d:%02d", h, m, s);
    }
}

 


πŸ” μ½”λ“œ μ„€λͺ…

 

πŸ“Œ 1. 둜그 기반 μ‹œμ²­μž 수 λ³€ν™” 기둝

viewers[start] += 1;
viewers[end] -= 1;

βœ” 각 둜그의 μ‹œμž‘ μ‹œμ μ—λŠ” μ‹œμ²­μž 수 +1, μ’…λ£Œ μ‹œμ μ—λŠ” -1

βœ” 이후 λˆ„μ ν•©μ„ 톡해 μ΄ˆλ‹Ή μ‹œμ²­μž 수 계산

 


πŸ“Œ 2. λˆ„μ ν•© 2번 ν™œμš©

// 첫 번째 λˆ„μ ν•©: μ΄ˆλ‹Ή μ‹œμ²­μž 수
for (int i = 1; i <= playLength; i++) {
    viewers[i] += viewers[i - 1];
}
// 두 번째 λˆ„μ ν•©: λˆ„μ  μ‹œμ²­ μ‹œκ°„
for (int i = 1; i <= playLength; i++) {
    viewers[i] += viewers[i - 1];
}

βœ” 첫 번째 λˆ„μ ν•©μ€ μ΄ˆλ§ˆλ‹€ μ‹œμ²­μž 수 계산

βœ” 두 번째 λˆ„μ ν•©μ€ λˆ„μ  μ‹œμ²­ μ‹œκ°„ 계산을 μœ„ν•œ μ€€λΉ„

 


πŸ“Œ 3. μŠ¬λΌμ΄λ”© μœˆλ„μš°λ‘œ 졜적 ꡬ간 탐색

long viewTime = viewers[i] - viewers[i - advLength];

βœ” iμ΄ˆκΉŒμ§€ λˆ„μ  μ‹œμ²­ μ‹œκ°„ - (i - κ΄‘κ³ μ‹œκ°„)μ΄ˆκΉŒμ§€ λˆ„μ  μ‹œμ²­ μ‹œκ°„

βœ” κ°€μž₯ λˆ„μ  μ‹œμ²­ μ‹œκ°„μ΄ 큰 κ΅¬κ°„μ˜ μ‹œμž‘ μ‹œκ°μ„ μ €μž₯

 


πŸ† 정리

 

βœ… 핡심 포인트

 

βœ” 초 λ‹¨μœ„ λ°°μ—΄ + λˆ„μ ν•©μœΌλ‘œ μ‹œκ°„ νš¨μœ¨μ„± 확보

βœ” κ΄‘κ³  μ‹œμ²­ μ‹œκ°„ μ΅œλŒ€ ꡬ간을 μŠ¬λΌμ΄λ”© μœˆλ„μš°λ‘œ λΉ λ₯΄κ²Œ 탐색

βœ” λ¬Έμžμ—΄ ↔ 초 λ³€ν™˜ μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜ μ‚¬μš© (toSeconds, toTime)


🎯 이 μ•Œκ³ λ¦¬μ¦˜μ˜ μž₯점

 

βœ… 1초 λ‹¨μœ„λ‘œ λ³€ν™˜ν•΄ μ •λ°€ν•œ μ‹œμ²­ μ‹œκ°„ 계산 κ°€λŠ₯

βœ… λˆ„μ ν•©κ³Ό ꡬ간 합을 μ΄μš©ν•΄ κ΄‘κ³  μ‚½μž… μ‹œμ μ„ 효율적으둜 찾음

βœ… λ§Žμ€ 둜그 데이터가 μžˆμ–΄λ„ λΉ λ₯΄κ²Œ 처리 κ°€λŠ₯

 


이 글이 도움이 λ˜μ…¨λ‹€λ©΄ μ’‹μ•„μš”μ™€ 곡유 λΆ€νƒλ“œλ¦½λ‹ˆλ‹€! 😊

 

 

 

'Algorithm & Data Structures > Programers' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

Lv 4. λ¬΄μ§€μ˜ λ¨Ήλ°© 라이브  (2) 2025.04.08
Lv 2. 택배 배달과 μˆ˜κ±°ν•˜κΈ°  (0) 2025.04.04
Lv 4. ν˜Έν…” λ°© λ°°μ •  (4) 2025.03.21
Lv 3. 미둜 νƒˆμΆœ λͺ…λ Ήμ–΄  (0) 2025.03.17
Lv 2. μ§€κ²Œμ°¨μ™€ 크레인  (0) 2025.03.13
'Algorithm & Data Structures/Programers' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • Lv 4. λ¬΄μ§€μ˜ λ¨Ήλ°© 라이브
  • Lv 2. 택배 배달과 μˆ˜κ±°ν•˜κΈ°
  • Lv 4. ν˜Έν…” λ°© λ°°μ •
  • Lv 3. 미둜 νƒˆμΆœ λͺ…λ Ήμ–΄
Geisha
Geisha
개발 일기
  • Geisha
    Geisha
    Geisha
  • 전체
    였늘
    μ–΄μ œ
    • λΆ„λ₯˜ 전체보기 (347)
      • Algorithm & Data Structures (265)
        • BOJ (123)
        • SWEA (1)
        • Programers (137)
        • Data Structures (3)
      • DB (29)
        • SQL (23)
        • RDBMS (2)
      • Java (1)
        • Class (1)
      • Spring (5)
        • Spring MVC (1)
        • Annotations (1)
      • CS (36)
        • 운영체제 (13)
        • λ„€νŠΈμ›Œν¬ (5)
      • Tool (6)
        • Git (5)
        • AWS (1)
      • Project (1)
  • λΈ”λ‘œκ·Έ 메뉴

    • ν™ˆ
    • νƒœκ·Έ
    • λ°©λͺ…둝
  • 링크

  • 곡지사항

  • 인기 κΈ€

  • νƒœκ·Έ

    μ•Œκ³ λ¦¬μ¦˜
    DynamicProgramming
    dfs
    λ‹€μ΅μŠ€νŠΈλΌ
    κ΅¬ν˜„
    ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€
    μœ„μƒμ •λ ¬
    μžλ°”
    binarySearch
    Union-Find
    baekjoon
    SQL
    이뢄탐색
    programmers
    dp
    κ³¨λ“œ
    λ°±μ€€
    λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°
    κ²½λ‘œμ••μΆ•
    Java
    algorithm
    BFS
    μŠ€νƒ
    Stack
    λ°±νŠΈλž˜ν‚Ή
    μœ λ‹ˆμ˜¨νŒŒμΈλ“œ
    λ™μ κ³„νšλ²•
    νˆ¬ν¬μΈν„°
    Dijkstra
    PriorityQueue
  • 졜근 λŒ“κΈ€

  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.0
Geisha
Lv 3. κ΄‘κ³  μ‚½μž…
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”