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 |