관리 메뉴

Binary Journey

[ν…Œμ½”ν…Œμ½”1.5 1-01] λ™μ˜μƒ μž¬μƒκΈ° λ³Έλ¬Έ

Algorithm/ν…Œμ½”ν…Œμ½”1.5(2025.01)

[ν…Œμ½”ν…Œμ½”1.5 1-01] λ™μ˜μƒ μž¬μƒκΈ°

binaryJournalist 2025. 1. 12. 18:02
λ°˜μ‘ν˜•
πŸ’‘ν…Œμ½”ν…Œμ½” μ‹œμ¦Œ 1.5 1회 λͺ¨μž„ off-site 문제 ν’€μ΄μž…λ‹ˆλ‹€. (2025.01.12)

 

 

문제

좜처: ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - PCCP 기좜문제 01. λ™μ˜μƒ μž¬μƒκΈ°


λ‚΄μš©

당신은 λ™μ˜μƒ μž¬μƒκΈ°λ₯Ό λ§Œλ“€κ³  μžˆμŠ΅λ‹ˆλ‹€. λ‹Ήμ‹ μ˜ λ™μ˜μƒ μž¬μƒκΈ°λŠ” 10초 μ „μœΌλ‘œ 이동, 10초 ν›„λ‘œ 이동, μ˜€ν”„λ‹ κ±΄λ„ˆλ›°κΈ° 3가지 κΈ°λŠ₯을 μ§€μ›ν•©λ‹ˆλ‹€. 각 κΈ°λŠ₯이 μˆ˜ν–‰ν•˜λŠ” μž‘μ—…μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • 10초 μ „μœΌλ‘œ 이동: μ‚¬μš©μžκ°€ "prev" λͺ…령을 μž…λ ₯ν•  경우 λ™μ˜μƒμ˜ μž¬μƒ μœ„μΉ˜λ₯Ό ν˜„μž¬ μœ„μΉ˜μ—μ„œ 10초 μ „μœΌλ‘œ μ΄λ™ν•©λ‹ˆλ‹€. ν˜„μž¬ μœ„μΉ˜κ°€ 10초 미만인 경우 μ˜μƒμ˜ 처음 μœ„μΉ˜λ‘œ μ΄λ™ν•©λ‹ˆλ‹€. μ˜μƒμ˜ 처음 μœ„μΉ˜λŠ” 0λΆ„ 0μ΄ˆμž…λ‹ˆλ‹€.
  • 10초 ν›„λ‘œ 이동: μ‚¬μš©μžκ°€ "next" λͺ…령을 μž…λ ₯ν•  경우 λ™μ˜μƒμ˜ μž¬μƒ μœ„μΉ˜λ₯Ό ν˜„μž¬ μœ„μΉ˜μ—μ„œ 10초 ν›„λ‘œ μ΄λ™ν•©λ‹ˆλ‹€. λ™μ˜μƒμ˜ 남은 μ‹œκ°„μ΄ 10초 미만일 경우 μ˜μƒμ˜ λ§ˆμ§€λ§‰ μœ„μΉ˜λ‘œ μ΄λ™ν•©λ‹ˆλ‹€. μ˜μƒμ˜ λ§ˆμ§€λ§‰ μœ„μΉ˜λŠ” λ™μ˜μƒμ˜ 길이와 κ°™μŠ΅λ‹ˆλ‹€.
  • μ˜€ν”„λ‹ κ±΄λ„ˆλ›°κΈ°: ν˜„μž¬ μž¬μƒ μœ„μΉ˜κ°€ μ˜€ν”„λ‹ ꡬ간(op_start ≤ ν˜„μž¬ μž¬μƒ μœ„μΉ˜ ≤ op_end)인 경우 μžλ™μœΌλ‘œ μ˜€ν”„λ‹μ΄ λλ‚˜λŠ” μœ„μΉ˜λ‘œ μ΄λ™ν•©λ‹ˆλ‹€.

λ™μ˜μƒμ˜ 길이λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ¬Έμžμ—΄ video_len, κΈ°λŠ₯이 μˆ˜ν–‰λ˜κΈ° μ§μ „μ˜ μž¬μƒμœ„μΉ˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ¬Έμžμ—΄ pos, μ˜€ν”„λ‹ μ‹œμž‘ μ‹œκ°μ„ λ‚˜νƒ€λ‚΄λŠ” λ¬Έμžμ—΄ op_start, μ˜€ν”„λ‹μ΄ λλ‚˜λŠ” μ‹œκ°μ„ λ‚˜νƒ€λ‚΄λŠ” λ¬Έμžμ—΄ op_end, μ‚¬μš©μžμ˜ μž…λ ₯을 λ‚˜νƒ€λ‚΄λŠ” 1차원 λ¬Έμžμ—΄ λ°°μ—΄ commandsκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§‘λ‹ˆλ‹€. μ΄λ•Œ μ‚¬μš©μžμ˜ μž…λ ₯이 λͺ¨λ‘ λλ‚œ ν›„ λ™μ˜μƒμ˜ μœ„μΉ˜λ₯Ό "mm:ss" ν˜•μ‹μœΌλ‘œ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄ μ£Όμ„Έμš”.

 

 

μ œν•œ 사항

  • video_len의 길이 = pos의 길이 = op_start의 길이 = op_end의 길이 = 5
    • video_len, pos, op_start, op_endλŠ” "mm:ss" ν˜•μ‹μœΌλ‘œ mmλΆ„ ss초λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • 0 ≤ mm ≤ 59
    • 0 ≤ ss ≤ 59
    • λΆ„, μ΄ˆκ°€ ν•œ 자리일 경우 0을 λΆ™μ—¬ 두 자리둜 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • λΉ„λ””μ˜€μ˜ ν˜„μž¬ μœ„μΉ˜ ν˜Ήμ€ μ˜€ν”„λ‹μ΄ λλ‚˜λŠ” μ‹œκ°μ΄ λ™μ˜μƒμ˜ λ²”μœ„ 밖인 κ²½μš°λŠ” 주어지지 μ•ŠμŠ΅λ‹ˆλ‹€.
    • μ˜€ν”„λ‹μ΄ μ‹œμž‘ν•˜λŠ” μ‹œκ°μ€ 항상 μ˜€ν”„λ‹μ΄ λλ‚˜λŠ” μ‹œκ°λ³΄λ‹€ μ „μž…λ‹ˆλ‹€.
  • 1 ≤ commands의 길이 ≤ 100
    • commands의 μ›μ†ŒλŠ” "prev" ν˜Ήμ€ "next"μž…λ‹ˆλ‹€.
    • "prev"λŠ” 10초 μ „μœΌλ‘œ μ΄λ™ν•˜λŠ” λͺ…λ Ήμž…λ‹ˆλ‹€.
    • "next"λŠ” 10초 ν›„λ‘œ μ΄λ™ν•˜λŠ” λͺ…λ Ήμž…λ‹ˆλ‹€.

 

κΈ°λ‘ν•˜κΈ°

πŸ’‘ μ–΄λ””κΉŒμ§€ μƒκ°ν•΄λ΄€λŠ”μ§€ λ‹¨κ³„μ μœΌλ‘œ κΈ°λ‘ν•΄λ΄…λ‹ˆλ‹€.

 

μ–΄λ–€ μ•Œκ³ λ¦¬μ¦˜μ„ μ μš©ν•˜λ € ν–ˆλ‚˜μš”?

 

μ—†μŒ. mm:ssλ₯Ό 초둜 λ³€ν™˜ν•˜μ—¬ κ³„μ‚°ν•˜λ € 함.

 

 

적용 κ·Όκ±°λŠ” λ¬΄μ—‡μΈκ°€μš”?

그게 더 빠름

 

풀이

풀이 μ‹œκ°„

μ‹œμž‘ μ‹œκ° μ’…λ£Œ μ‹œκ° 총 μ†Œμš” μ‹œκ°„
13:27 14:11 44λΆ„

 

문제 뢄석

μ œμ•½ 사항 νŒŒμ•… & ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ μž‘μ„±

  • video_len의 길이 = pos의 길이 = op_start의 길이 = op_end의 길이 = 5
    • video_len, pos, op_start, op_endλŠ” "mm:ss" ν˜•μ‹μœΌλ‘œ mmλΆ„ ss초λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • 0 ≤ mm ≤ 59
    • 0 ≤ ss ≤ 59
    • λΆ„, μ΄ˆκ°€ ν•œ 자리일 경우 0을 λΆ™μ—¬ 두 자리둜 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • λΉ„λ””μ˜€μ˜ ν˜„μž¬ μœ„μΉ˜ ν˜Ήμ€ μ˜€ν”„λ‹μ΄ λλ‚˜λŠ” μ‹œκ°μ΄ λ™μ˜μƒμ˜ λ²”μœ„ 밖인 κ²½μš°λŠ” 주어지지 μ•ŠμŠ΅λ‹ˆλ‹€.
    • μ˜€ν”„λ‹μ΄ μ‹œμž‘ν•˜λŠ” μ‹œκ°μ€ 항상 μ˜€ν”„λ‹μ΄ λλ‚˜λŠ” μ‹œκ°λ³΄λ‹€ μ „μž…λ‹ˆλ‹€.
  • 1 ≤ commands의 길이 ≤ 100
    • commands의 μ›μ†ŒλŠ” "prev" ν˜Ήμ€ "next"μž…λ‹ˆλ‹€.
    • "prev"λŠ” 10초 μ „μœΌλ‘œ μ΄λ™ν•˜λŠ” λͺ…λ Ήμž…λ‹ˆλ‹€.
    • "next"λŠ” 10초 ν›„λ‘œ μ΄λ™ν•˜λŠ” λͺ…λ Ήμž…λ‹ˆλ‹€.

 

μž…λ ₯κ°’ 뢄석

πŸ’‘ μž…λ ₯값을 λΆ„μ„ν•˜λ©΄ λ¬Έμ œμ—μ„œ μš”κ΅¬ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹œκ°„ λ³΅μž‘λ„λ₯Ό κ°„μ ‘μ μœΌλ‘œ νŒŒμ•…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

video_len pos op_start op_end commands result
"34:33" "13:00" "00:55" "02:55" ["next", "prev"] "13:00"
"10:55" "00:05" "00:15" "06:55" ["prev", "next", "next"] "06:55"
"07:22" "04:05" "00:15" "04:07" ["next"] "04:17"

 

μž…μΆœλ ₯ 예 #1

  • μ‹œμž‘ μœ„μΉ˜ 13λΆ„ 0μ΄ˆμ—μ„œ 10초 ν›„λ‘œ μ΄λ™ν•˜λ©΄ 13λΆ„ 10μ΄ˆμž…λ‹ˆλ‹€.
  • 13λΆ„ 10μ΄ˆμ—μ„œ 10초 μ „μœΌλ‘œ μ΄λ™ν•˜λ©΄ 13λΆ„ 0μ΄ˆμž…λ‹ˆλ‹€.
  • λ”°λΌμ„œ "13:00"을 return ν•˜λ©΄ λ©λ‹ˆλ‹€.

μž…μΆœλ ₯ 예 #2

  • μ‹œμž‘ μœ„μΉ˜ 0λΆ„ 5μ΄ˆμ—μ„œ 10초 μ „μœΌλ‘œ μ΄λ™ν•©λ‹ˆλ‹€. ν˜„μž¬ μœ„μΉ˜κ°€ 10초 미만이기 λ•Œλ¬Έμ— 0λΆ„ 0초둜 μ΄λ™ν•©λ‹ˆλ‹€.
  • 0λΆ„ 0μ΄ˆμ—μ„œ 10초 ν›„λ‘œ μ΄λ™ν•˜λ©΄ 0λΆ„ 10μ΄ˆμž…λ‹ˆλ‹€.
  • 0λΆ„ 10μ΄ˆμ—μ„œ 10초 ν›„λ‘œ μ΄λ™ν•˜λ©΄ 0λΆ„ 20μ΄ˆμž…λ‹ˆλ‹€. 0λΆ„ 20μ΄ˆλŠ” μ˜€ν”„λ‹ ꡬ간이기 λ•Œλ¬Έμ— μ˜€ν”„λ‹μ΄ λλ‚˜λŠ” μœ„μΉ˜μΈ 6λΆ„ 55초둜 μ΄λ™ν•©λ‹ˆλ‹€. λ”°λΌμ„œ "06:55"λ₯Ό return ν•˜λ©΄ λ©λ‹ˆλ‹€.

μž…μΆœλ ₯ 예 #3

  • μ‹œμž‘ μœ„μΉ˜ 4λΆ„ 5μ΄ˆλŠ” μ˜€ν”„λ‹ ꡬ간이기 λ•Œλ¬Έμ— μ˜€ν”„λ‹μ΄ λλ‚˜λŠ” μœ„μΉ˜μΈ 4λΆ„ 7초둜 μ΄λ™ν•©λ‹ˆλ‹€. 4λΆ„ 7μ΄ˆμ—μ„œ 10초 ν›„λ‘œ μ΄λ™ν•˜λ©΄ 4λΆ„ 17μ΄ˆμž…λ‹ˆλ‹€. λ”°λΌμ„œ "04:17"을 return ν•˜λ©΄ λ©λ‹ˆλ‹€.

 

 

μ˜μ‚¬ μ½”λ“œ μž‘μ„±

πŸ’‘ μ˜μ‚¬ μ½”λ“œλŠ” λ™μž‘ μ€‘μ‹¬μœΌλ‘œ μž‘μ„±ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.

πŸ’‘ μ˜μ‚¬ μ½”λ“œλŠ” 문제 ν•΄κ²° μˆœμ„œλ‘œ μž‘μ„±ν•©λ‹ˆλ‹€.

πŸ’‘ μ˜μ‚¬ μ½”λ“œλ₯Ό μΆ©λΆ„νžˆ ν…ŒμŠ€νŠΈν•΄λ΄…λ‹ˆλ‹€.

solution(video_len, pos, op_start, op_end, commands) {
    // 1. (string) mm:ss -> (int) mm * 60 + ss λ³€κ²½
    for (String command : commands) {
        // 2. μ˜€ν”„λ‹ ꡬ간에 μ†ν•˜λŠ”μ§€ νŒŒμ•… ν•„μš”
        // 3. prev 일 λ•Œ 0λΆ„ 0초 확인
        // 4. next 일 λ•Œ λ™μ˜μƒ 길이 μ΄ˆκ³Όν•˜λŠ”μ§€ 확인
    }
    // 5. (int) mm * 60 + ss -> pos: (string) time / 60 + ":" + (string) time % ss λ³€κ²½
}

 

 

κ΅¬ν˜„

import java.util.HashMap;

class Solution {
    public String solution(String video_len, String pos, String op_start, String op_end, String[] commands) {
        // 1. (string) mm:ss -> (int) mm * 60 + ss λ³€κ²½
        int total = convertMmSsTo60s(video_len);
        int current = convertMmSsTo60s(pos);
        int start = convertMmSsTo60s(op_start);
        int end = convertMmSsTo60s(op_end);

        // 2. μ»€λ§¨λ“œλ§΅ 생성
        HashMap<String, Integer> commandsMap = new HashMap<>();
        commandsMap.put("next", 10);
        commandsMap.put("prev", -10);

        for (String command : commands) {
            // 3. μ»€λ§¨λ“œλ§ˆλ‹€ μ˜€ν”„λ‹ ꡬ간에 μ†ν•˜λŠ”μ§€ νŒŒμ•… ν•„μš”
            if (start <= current && current < end) {
                current = end;
            }
            current = Math.min(total, Math.max(0, current + commandsMap.get(command)));
        }

        // 4. ꡬ간 μ΅œμ’… 확인
        current = start <= current && current < end ? end : current;

        // 5. (int) seconds -> (string) mm:ss λ³€ν™˜
        return convert60sToMmSs(current);
    }

    // (string) mm:ss -> (int) seconds λ³€ν™˜
    public int convertMmSsTo60s(String mmSs) {
        String[] mmAndSs = mmSs.split(":");
        return Integer.parseInt(mmAndSs[0]) * 60 + Integer.parseInt(mmAndSs[1]);
    }

    // (int) seconds -> (string) mm:ss λ³€ν™˜
    public String convert60sToMmSs(int seconds) {
        String mm = padLeft(2, seconds / 60);
        String ss = padLeft(2, seconds % 60);
        return mm + ":" + ss;
    }

    public String padLeft(int n, int i) {
        return String.format("%0" + n + "d", i);
    }
}
λ°˜μ‘ν˜•