Tech for good

[Leetcode/TwoPointer] 443. String Compression ๋ณธ๋ฌธ

IT/Computer Science

[Leetcode/TwoPointer] 443. String Compression

Diana Kang 2025. 2. 21. 04:15

๐Ÿ“Œ ์ฝ”๋“œ ์„ค๋ช…: ๋ฌธ์ž์—ด ์••์ถ• ์•Œ๊ณ ๋ฆฌ์ฆ˜

์ด ์ฝ”๋“œ๋Š” ์—ฐ์†๋œ ๋ฌธ์ž๋ฅผ ์••์ถ•ํ•˜์—ฌ ์›๋ž˜ ๋ฐฐ์—ด์„ ์ˆ˜์ •ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค.

๐Ÿ›  ์ฝ”๋“œ์˜ ํ•ต์‹ฌ ๊ฐœ๋…

  1. ํˆฌ ํฌ์ธํ„ฐ(Two-Pointer) ๊ธฐ๋ฒ• ์‚ฌ์šฉ
    • i โ†’ ์›๋ณธ ๋ฌธ์ž์—ด์„ ์ฝ์–ด๊ฐ€๋Š” ํฌ์ธํ„ฐ
    • write โ†’ ์••์ถ•๋œ ๋ฌธ์ž์—ด์„ ์ €์žฅํ•˜๋Š” ํฌ์ธํ„ฐ
  2. ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•ด ๊ฐ™์€ ๋ฌธ์ž๊ฐ€ ์—ฐ์†๋˜๋Š” ๊ทธ๋ฃน์„ ์ฐพ๊ณ , ์••์ถ•ํ•˜์—ฌ ์ €์žฅ
    • ๊ทธ๋ฃน์˜ ๊ธธ์ด๊ฐ€ 1์ด๋ฉด ๋ฌธ์ž๋งŒ ์ €์žฅ
    • ๊ทธ๋ฃน์˜ ๊ธธ์ด๊ฐ€ 2 ์ด์ƒ์ด๋ฉด "๋ฌธ์ž + ์ˆซ์ž(ํšŸ์ˆ˜)" ํ˜•ํƒœ๋กœ ์ €์žฅ
class Solution:
    def compress(self, chars: List[str]) -> int:
        write = 0  # ์••์ถ•๋œ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•  ์œ„์น˜
        i = 0  # ์›๋ณธ ๋ฐฐ์—ด์„ ํƒ์ƒ‰ํ•˜๋Š” ์œ„์น˜

        while i < len(chars):  # ๋ฐฐ์—ด์„ ๋๊นŒ์ง€ ํƒ์ƒ‰
            char = chars[i]  # ํ˜„์žฌ ๋ฌธ์ž ์ €์žฅ
            count = 1  # ํ˜„์žฌ ๋ฌธ์ž์˜ ๊ฐœ์ˆ˜ (๊ธฐ๋ณธ๊ฐ’ 1)

            # ๊ฐ™์€ ๋ฌธ์ž๊ฐ€ ์—ฐ์†ํ•ด์„œ ๋‚˜ํƒ€๋‚˜๋Š”์ง€ ํ™•์ธ
            while i + 1 < len(chars) and chars[i + 1] == char:
                count += 1
                i += 1  # ๋‹ค์Œ ๋ฌธ์ž๋กœ ์ด๋™

            # ์••์ถ•๋œ ๊ฒฐ๊ณผ ์ €์žฅ
            chars[write] = char  # ํ˜„์žฌ ๋ฌธ์ž ์ €์žฅ
            write += 1  # ๋‹ค์Œ ์ €์žฅ ์œ„์น˜๋กœ ์ด๋™

            # ๋ฌธ์ž๊ฐ€ 2๊ฐœ ์ด์ƒ ๋ฐ˜๋ณต๋˜์—ˆ์œผ๋ฉด ์ˆซ์ž๋„ ์ €์žฅ
            if count > 1:
                for digit in str(count):  # ์ˆซ์ž๋ฅผ ํ•œ ๊ธ€์ž์”ฉ ์ €์žฅ
                    chars[write] = digit
                    write += 1

            i += 1  # ๋‹ค์Œ ๋ฌธ์ž ๊ทธ๋ฃน์œผ๋กœ ์ด๋™

        return write  # ์••์ถ•๋œ ๋ฐฐ์—ด์˜ ๊ธธ์ด ๋ฐ˜ํ™˜

๐ŸŸข Step 1: ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™”

        write = 0  # ์••์ถ•๋œ ๋ฌธ์ž์—ด์„ ์ €์žฅํ•  ์œ„์น˜ (์“ฐ๊ธฐ ํฌ์ธํ„ฐ)
        i = 0  # ์›๋ณธ ๋ฌธ์ž์—ด์„ ์ฝ์–ด๊ฐ€๋Š” ์œ„์น˜ (์ฝ๊ธฐ ํฌ์ธํ„ฐ)
  • write: ์••์ถ•๋œ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๋Š” ์œ„์น˜
  • i: ์›๋ณธ ๋ฐฐ์—ด์„ ํƒ์ƒ‰ํ•˜๋Š” ์œ„์น˜

๐ŸŸข Step 2: ์›๋ณธ ๋ฐฐ์—ด์„ ํƒ์ƒ‰ํ•˜๋ฉฐ ๋ฌธ์ž ๊ทธ๋ฃน ์ฐพ๊ธฐ

        while i < len(chars):  # ๋ฐฐ์—ด ๋๊นŒ์ง€ ํƒ์ƒ‰
            char = chars[i]  # ํ˜„์žฌ ๋ฌธ์ž ์ €์žฅ
            count = 1  # ํ˜„์žฌ ๋ฌธ์ž ๊ทธ๋ฃน์˜ ๊ฐœ์ˆ˜ (๊ธฐ๋ณธ๊ฐ’ 1)

 

  • char: ํ˜„์žฌ ๋ฌธ์ž ์ €์žฅ
  • count: ์—ฐ์†๋œ ๋ฌธ์ž์˜ ๊ฐœ์ˆ˜ (์ตœ์†Œ 1)
            while i + 1 < len(chars) and chars[i + 1] == char:
                count += 1  # ๊ฐ™์€ ๋ฌธ์ž๋ผ๋ฉด ๊ฐœ์ˆ˜๋ฅผ ์ฆ๊ฐ€
                i += 1  # ๋‹ค์Œ ๋ฌธ์ž๋กœ ์ด๋™

 

 

  • while ๋ฌธ์œผ๋กœ ๊ฐ™์€ ๋ฌธ์ž๊ฐ€ ๋ช‡ ๋ฒˆ ์—ฐ์†๋˜๋Š”์ง€ ํ™•์ธ
  • count ๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚ค๋ฉฐ ๋ฐ˜๋ณต ๊ฐœ์ˆ˜๋ฅผ ์ธก์ •

๐ŸŸข Step 3: ๋ฌธ์ž์™€ ๊ฐœ์ˆ˜๋ฅผ chars ๋ฆฌ์ŠคํŠธ์— ์ €์žฅ

            chars[write] = char  # ํ˜„์žฌ ๋ฌธ์ž ์ €์žฅ
            write += 1  # ๋‹ค์Œ ์ €์žฅ ์œ„์น˜๋กœ ์ด๋™

 

  • ํ˜„์žฌ ๋ฌธ์ž๋ฅผ write ์œ„์น˜์— ์ €์žฅ
  • write ํฌ์ธํ„ฐ๋ฅผ ์ด๋™
            if count > 1:  # ๋ฌธ์ž๊ฐ€ 2๋ฒˆ ์ด์ƒ ๋ฐ˜๋ณต๋˜์—ˆ์„ ๋•Œ๋งŒ ์ˆซ์ž ์ €์žฅ
                for digit in str(count):  # ์ˆซ์ž๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ ํ›„ ํ•œ ๊ธ€์ž์”ฉ ์ €์žฅ
                    chars[write] = digit
                    write += 1

 

  • count > 1์ธ ๊ฒฝ์šฐ, ๊ฐœ์ˆ˜๋ฅผ ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ํ•œ ๊ธ€์ž์”ฉ chars์— ์ €์žฅ
  • ์˜ˆ๋ฅผ ๋“ค์–ด, "bbbb" โ†’ "b4"

๐ŸŸข Step 4: ๋‹ค์Œ ๋ฌธ์ž ๊ทธ๋ฃน์œผ๋กœ ์ด๋™

            i += 1  # ๋‹ค์Œ ๋ฌธ์ž ๊ทธ๋ฃน์œผ๋กœ ์ด๋™

 

 

  • i๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ ๋‹ค์Œ ๋ฌธ์ž๋กœ ์ด๋™
  • ์ƒˆ๋กœ์šด ๋ฌธ์ž ๊ทธ๋ฃน์„ ํƒ์ƒ‰

๐ŸŸข Step 5: ์••์ถ•๋œ ๋ฐฐ์—ด์˜ ๊ธธ์ด ๋ฐ˜ํ™˜

        return write  # ์••์ถ•๋œ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด ๋ฐ˜ํ™˜

 

  • write๋Š” ์••์ถ•๋œ ๊ฒฐ๊ณผ์˜ ๊ธธ์ด๋ฅผ ๋‚˜ํƒ€๋ƒ„

 

โณ ์‹œ๊ฐ„ ๋ณต์žก๋„ ๋ถ„์„

  • i์™€ write ํฌ์ธํ„ฐ๊ฐ€ ํ•œ ๋ฒˆ๋งŒ ๋ฐฐ์—ด์„ ํƒ์ƒ‰ํ•˜๋ฏ€๋กœ O(n)
  • ์ถ”๊ฐ€ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์›๋ณธ ๋ฐฐ์—ด์„ ์ˆ˜์ •ํ•˜๋ฏ€๋กœ O(1) ๊ณต๊ฐ„ ๋ณต์žก๋„