Hello Kitty Eyes Shut
λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

πŸ’» μ½”ν…Œ/πŸ“Œ JAVA

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€/JAVA] λ™μ˜μƒ μž¬μƒκΈ°

λ°˜μ‘ν˜•

 

 

 

πŸ”— 문제 λ°”λ‘œκ°€κΈ°

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

 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

SW개발자λ₯Ό μœ„ν•œ 평가, ꡐ윑의 Total Solution을 μ œκ³΅ν•˜λŠ” 개발자 μ„±μž₯을 μœ„ν•œ λ² μ΄μŠ€μΊ ν”„

programmers.co.kr

 


πŸ“Œ 문제 μš”μ•½

 

 

λ™μ˜μƒ μž¬μ‹±κΈ°λŠ” μ•„λž˜μ˜ 3κ°€μ§€ κΈ°λŠ₯을 μ§€μ›ν•œλ‹€.

 

1️⃣ 10초 μ „μœΌλ‘œ 이동 (prev)

  • ν˜„μž¬ μœ„μΉ˜μ—μ„œ 10초 μ΄μ „μœΌλ‘œ μ΄λ™ν•œλ‹€.
  • 단, ν˜„μž¬ μœ„μΉ˜κ°€ 10초 미만인 경우, μ˜μƒμ˜ 처음 μœ„μΉ˜(0λΆ„ 0초)둜 μ΄λ™ν•œλ‹€.

2️⃣ 10초 ν›„λ‘œ 이동 (next)

  • ν˜„μž¬ μœ„μΉ˜μ—μ„œ 10초 μ΄ν›„λ‘œ μ΄λ™ν•œλ‹€.
  • 단, μ˜μƒ μ’…λ£Œ μ‹œκ°„μ„ μ΄ˆκ³Όν•˜λŠ” 경우, μ˜μƒ 끝으둜 μ΄λ™ν•œλ‹€.

3️⃣ μ˜€ν”„λ‹ μžλ™ κ±΄λ„ˆλ›°κΈ°

  • ν˜„μž¬ μœ„μΉ˜κ°€ μ˜€ν”„λ‹ λ²”μœ„ (op_start ~ op_end) 사이라면, μžλ™μœΌλ‘œ μ˜€ν”„λ‹ μ’…λ£Œ μ‹œμ (op_end)으둜 μ΄λ™ν•œλ‹€.

 

μž…λ ₯은 μ•„λž˜μ™€ κ°™λ‹€.

  • video_len : μ˜μƒ 전체 길이 ("mm:ss" ν˜•μ‹)
  • pos : κΈ°λŠ₯ μˆ˜ν–‰ μ „ ν˜„μž¬ μœ„μΉ˜ ("mm:ss" ν˜•μ‹)
  • op_start, op_end : μ˜€ν”„λ‹ μ‹œμž‘ / μ˜€ν”„λ‹ μ’…λ£Œ μ‹œμ  ("mm:ss" ν˜•μ‹)
  • commands : μ‚¬μš©μžκ°€ μž…λ ₯ν•œ λͺ…λ Ή λ°°μ—΄ (ex. ["prev", "next", "next"])

 

 

🚨 μ£Όμ˜μ‚¬ν•­

μ œκ°€ 처음 문제λ₯Ό ν’€μ—ˆμ„ λ•Œμ—λŠ” "μ˜€ν”„λ‹ κ±΄λ„ˆλ›°κΈ°" κΈ°λŠ₯이 λ”°λ‘œ μžˆλŠ”κ±΄ 쀄 μ•Œκ³ ,

"prev", "next" μ™Έμ˜ λͺ…λ Ήμ–΄λŠ” μ˜€ν”„λ‹ κ±΄λ„ˆλ›°κΈ°λ‘œ μ²˜λ¦¬ν•œλ‹€κ³  λ‘œμ§μ„ μ§°λ‹€κ°€ ν•œμ°Έμ„ λ””λ²„κΉ…ν–ˆμ—ˆμŠ΅λ‹ˆλ‹€ ..πŸ˜“

 

μ‹€μ œλ‘œλŠ” commandsλ₯Ό μ²˜λ¦¬ν•˜λ‹€κ°€ μ˜€ν”„λ‹ ꡬ간에 μœ„μΉ˜ν•˜κ²Œ 되면,

λ³„λ„μ˜ λͺ…λ Ή 없이 μžλ™μœΌλ‘œ op_end둜 이동해주어야 ν•˜λ‹ˆ 이 뢀뢄을 μ£Όμ˜ν•΄μ£Όμ„Έμš” !

 

처음 μ‹œμž‘ν•  λ•Œλ„, λͺ…령을 μˆ˜ν–‰ν•œ 이후에도 항상 μžλ™μœΌλ‘œ μ μš©λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€ !!

 


πŸ’‘ 아이디어

1️⃣ ⏱ μ‹œκ°„ λ¬Έμžμ—΄μ„ 초 λ‹¨μœ„λ‘œ λ³€ν™˜ν•˜κΈ°

int toSecond(String time){
    String[] sub_time = time.split(":");
    int min = Integer.parseInt(sub_time[0]);
    int sec = Integer.parseInt(sub_time[1]);
    return min * 60 + sec;
}

 

λͺ¨λ“  μ‹œκ°„μ— κ΄€ν•œ 정보듀이 "mm:ss" ν˜•μ‹μœΌλ‘œ μ£Όμ–΄μ§€κΈ° λ•Œλ¬Έμ— κ³„μ†ν•΄μ„œ μ‹œκ°„ λ³€ν™˜μ„ ν•΄μ£Όμ–΄μ•Ό λ˜λŠ”λ°

κ·Έ λ•Œλ§ˆλ‹€ ν•΄μ£ΌκΈ°μ—” λ„ˆλ¬΄ 번거둜울 것 κ°™μ•„ λ³„λ„μ˜ λ©”μ„œλ“œλ‘œ λΆ„λ¦¬ν•΄λ‘μ—ˆλ‹€.

 

mm:ss ν˜•μ‹μ˜ λ¬Έμžμ—΄μ„ λ°›μœΌλ©΄, :을 κΈ°μ€€μœΌλ‘œ λΆ„κ³Ό 초둜 μͺΌκ°  ν›„,

κ³„μ‚°μ˜ 일관성을 μœ„ν•΄ λͺ¨λ“  μ‹œκ°„μ„ 초 λ‹¨μœ„λ‘œ ν†΅μΌν–ˆλ‹€.

 

ex) "04:05" → 4 * 60 + 5 = 245초

 

 

 

2️⃣ πŸ” 초λ₯Ό λ‹€μ‹œ "mm:ss" ν˜•μ‹μœΌλ‘œ λ³€ν™˜ν•˜κΈ°

String toTimeString(int time){
    int min = time / 60;
    int sec = time % 60;
    return String.format("%02d:%02d", min, sec);
}

 

μ΅œμ’… κ²°κ³ΌλŠ” 또 λ‹€μ‹œ "mm:ss" ν˜•νƒœλ‘œ λ°˜ν™˜ν•΄μ£Όμ–΄μ•Ό 되기 λ•Œλ¬Έμ—

μ–˜ λ˜ν•œ κ·Έλƒ₯ λ³„λ„μ˜ λ©”μ„œλ“œλ‘œ λ³€ν™˜κΈ°λ₯Ό λ§Œλ“€μ–΄λ‘μ—ˆλ‹€.

 

μ΄λ•Œ, String.format("%02d:%02d", ......)λ₯Ό μ‚¬μš©ν•΄μ„œ 항상 두 자리λ₯Ό μœ μ§€ν•˜κ²Œ μ²˜λ¦¬ν–ˆλ‹€.

λ”°λΌμ„œ μ΅œμ’… κ²°κ³Όκ°€ 4λΆ„ 5초이면 "04:05"둜 ν¬λ§·λœλ‹€.

 

3️⃣ πŸ“ μ˜€ν”„λ‹ 체크

commandsλ₯Ό μˆ˜ν–‰ μ‹œμž‘ν•˜κΈ° 전이든, μˆ˜ν–‰ν•˜λŠ” 쀑이든, μˆ˜ν–‰ν•œ ν›„λ“ 

항상 μ˜€ν”„λ‹ μœ„μΉ˜μ— κ±Έλ¦°λ‹€λ©΄ μžλ™μœΌλ‘œ κ±΄λ„ˆλ›°κΈ° ν•΄μ£Όμ–΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ—

μ•„λž˜μ™€ 같이 κΈ°λŠ₯ μˆ˜ν–‰ λ‘œμ§μ„ μ§œμ£Όμ—ˆλ‹€.

 

if(cur >= opStart && cur <= opEnd){
    cur = opEnd;
}
        
for(int i = 0; i < n; i++){
    if(commands[i].equals("prev")){
        cur = Math.max(0, cur - 10);
    }
    else if(commands[i].equals("next")){
        cur = Math.min(total, cur + 10);
    }
    if(cur >= opStart && cur <= opEnd){
        cur = opEnd;
    }
}

 

이처럼 κΈ°λŠ₯ μˆ˜ν–‰μ„ μ‹œμž‘ν•˜κΈ° 전에 ν•œ 번 μ˜€ν”„λ‹μΈμ§€ 체크λ₯Ό ν•΄μ£Όκ³ ,

κΈ°λŠ₯ μˆ˜ν–‰μ„ ν•˜λŠ” 쀑간쀑간에도 κ³„μ†ν•΄μ„œ μ˜€ν”„λ‹ 뢀뢄에 μœ„μΉ˜ν•˜λŠ”μ§€ 체크λ₯Ό ν•΄μ£Όμ—ˆλ‹€.

 

 

4️⃣ πŸš€ λͺ…λ Ή 처리

μ•žμ„œ 3λ²ˆμ—μ„œ μ²¨λΆ€ν•œ μ½”λ“œμ™€ 같이

prev λͺ…λ Ήμ–΄λŠ” 10초 μ΄μ „μœΌλ‘œ μ΄λ™ν•˜λ˜,

10초 전이 0보닀 μž‘μ€ 값이라면 κ·Έλƒ₯ 0λΆ„ 0초둜 μ΄λ™ν•˜λŠ” κΈ°λŠ₯이기 λ•Œλ¬Έμ—

0κ³Ό ν˜„μž¬ μœ„μΉ˜μ—μ„œ 10을 λΉΌμ€€ κ°’ 쀑 더 큰 값을 μ„ νƒν•˜λ„λ‘ ν•˜μ˜€λ‹€.

 

λ§ˆμ°¬κ°€μ§€λ‘œ next λͺ…λ Ήμ–΄λŠ” 10초 μ΄ν›„λ‘œ μ΄λ™ν•˜λ˜,

10초 ν›„κ°€ μ˜μƒ 전체 길이보닀 큰 값이라면 κ·Έλƒ₯ μ˜μƒμ˜ λ§ˆμ§€λ§‰ μœ„μΉ˜λ‘œ μ΄λ™ν•˜λ„λ‘ ν•˜μ—¬

μ˜μƒμ˜ λ§ˆμ§€λ§‰ μœ„μΉ˜μ™€ ν˜„μž¬ μœ„μΉ˜μ— 10을 λ”ν•œ κ°’ 쀑 더 μž‘μ€ 값을 μ„ νƒν•˜λ„λ‘ ν•˜μ˜€λ‹€.

 


πŸ‘©πŸ»‍πŸ’» μ΅œμ’… μ½”λ“œ

class Solution {
    
    int toSecond(String time){
        String[] sub_time = time.split(":");
        int min = Integer.parseInt(sub_time[0]);
        int sec = Integer.parseInt(sub_time[1]);
        return min * 60 + sec;
    }
        
    String toTimeString(int time){
        int min = time / 60;
        int sec = time % 60;
        return String.format("%02d:%02d", min, sec);
    }
    
    public String solution(String video_len, String pos, String op_start, String op_end, String[] commands) {    
        
        int total = toSecond(video_len);
        int cur = toSecond(pos);
        int opStart = toSecond(op_start);
        int opEnd = toSecond(op_end);
        
        int n = commands.length;
        
        
        if(cur >= opStart && cur <= opEnd){
                cur = opEnd;
        }
        
        for(int i = 0; i < n; i++){
            if(commands[i].equals("prev")){
                cur = Math.max(0, cur - 10);
            }
            else if(commands[i].equals("next")){
                cur = Math.min(total, cur + 10);
            }
            if(cur >= opStart && cur <= opEnd){
                cur = opEnd;
            }
        }
        
        return toTimeString(cur);
    }
}

 

 


πŸ•‘ μ‹œκ°„ λ³΅μž‘λ„

for (int i = 0; i < n; i++) { // commands λͺ…λ Ή μˆ˜ν–‰μ„ μœ„ν•œ 반볡
    ...
}

 

μœ„μ˜ λΆ€λΆ„μ—μ„œλ§Œ μ •ν™•νžˆ n번 λ°˜λ³΅μ„ μˆ˜ν–‰ν•˜κΈ° λ•Œλ¬Έμ— μ‹œκ°„ λ³΅μž‘λ„λŠ” O(n)이닀.

λ°˜μ‘ν˜•