728x90

LeetCode-38

Count and Say : The count-and-say sequence is a sequence of digit strings defined by the recursive formula:
note : To determine how you "say" a digit string, split it into the minimal number of substrings such that each substring contains exactly one unique digit. Then for each substring, say the number of digits, then say the digit. Finally, concatenate every said digit.

Answer

        :::python

class Solution: def countAndSay(self, n: int) -> str: # countAndSay(1) = "1" # countAndSay(2) = say "1" = one 1 = "11" # countAndSay(3) = say "11" = two 1's = "21" # countAndSay(4) = say "21" = one 2 + one 1 = "12" + "11" = "1211" if n==1: return '1' curr = 1 num='1' result = '' while curr<n: left, right = 0, 1 whi s = num[left] count=1 while right < len(num): if s == num[right]: count+=1 right+=1 else: break answer += f'{count}{s}' left = right right+=1 num = answer curr+=1 return answer

Result : 64ms Memory: 16.4mb

๋ฌธ์ œ ์„ค๋ช…

Count and Say ๋ฌธ์ œ๋Š” ์ฃผ์–ด์ง„ ์ˆซ์ž n์— ๋Œ€ํ•˜์—ฌ n๋ฒˆ์งธ ๋ฌธ๋งฅ์„ ๋ฆฌํ„ดํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ด ๋•Œ, ์ˆซ์ž n์€ 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ๋งฅ์˜ ๊ตฌ์„ฑ์€ ์•ž์ž๋ฆฌ์— ์ˆซ์ž์˜ ๊ฐฏ์ˆ˜, ๊ทธ ๋’ค์— ํ•ด๋‹น ์ˆซ์ž๋ฅผ ์ด์–ด๋ถ™์ธ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, n=1์ผ ๋•Œ ๋ฌธ๋งฅ์€ "1"์ž…๋‹ˆ๋‹ค. n=2์ผ ๋•Œ, countAndSay(1)์—์„œ ๋ฆฌํ„ด๋œ "1"์˜ ๋ฌธ๋งฅ์ด๋ฏ€๋กœ "11"์ด ๋ฆฌํ„ด๋ฉ๋‹ˆ๋‹ค. n=3์ผ ๋•Œ, countAndSay(2)์—์„œ ๋ฆฌํ„ด๋œ "11"์˜ ๋ฌธ๋งฅ์ด๋ฏ€๋กœ "21"์ด ๋ฆฌํ„ด๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ ๋ฌธ๋งฅ์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

ํ•ด๋‹น ๋ฌธ์ œ์—์„œ๋Š” ํ˜„์žฌ๊นŒ์ง€ ์ง„ํ–‰ํ•œ ๋ฌธ๋งฅ๊ณผ n์— ํ•ด๋‹นํ•˜๋Š” ์ˆ˜๋ฅผ ๋น„๊ตํ•˜์—ฌ ๋ฌธ๋งฅ์„ ๊ตฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์šฐ์„  n=1์ผ ๊ฒฝ์šฐ์—๋Š” "1"์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋‹ค์Œ๋ถ€ํ„ฐ๋Š” ํ˜„์žฌ๊นŒ์ง€ ๊ตฌํ•œ ๋ฌธ๋งฅ๊ณผ n๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ฌธ๋งฅ์„ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, n=2์ผ ๊ฒฝ์šฐ์—๋Š” countAndSay(1)์—์„œ ๋ฆฌํ„ด๋œ "1"์— ๋Œ€ํ•ด์„œ ๋ฌธ๋งฅ์„ ๊ตฌํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” 1์ด ํ•œ ๋ฒˆ ๋‚˜์˜ค๋ฏ€๋กœ "11"์ด ๋ฆฌํ„ด๋ฉ๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ n=3์ผ ๊ฒฝ์šฐ์—๋Š” countAndSay(2)์—์„œ ๋ฆฌํ„ด๋œ "11"์— ๋Œ€ํ•ด์„œ ๋ฌธ๋งฅ์„ ๊ตฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” 1์ด ๋‘ ๋ฒˆ ์—ฐ์†์œผ๋กœ ๋‚˜์˜ค๋ฏ€๋กœ "21"์ด ๋ฆฌํ„ด๋ฉ๋‹ˆ๋‹ค.

์ด์ฒ˜๋Ÿผ, ํ˜„์žฌ๊นŒ์ง€ ๊ตฌํ•œ ๋ฌธ๋งฅ์—์„œ ์—ฐ์†ํ•ด์„œ ๋‚˜์˜ค๋Š” ์ˆซ์ž๋“ค์„ ๊ทธ ์ˆ˜์˜ ๊ฐฏ์ˆ˜์™€ ๊ฐ™์ด ์ด์–ด๋ถ™์ธ ๋ฌธ์ž์—ด์„ ๊ตฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ ํ‰๊ฐ€

ํ•ด๋‹น ์ฝ”๋“œ๋Š” ์ œ๋Œ€๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. n๊ฐ’์ด 1์ผ ๊ฒฝ์šฐ์—๋Š” "1"์„, ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ํ˜„์žฌ๊นŒ์ง€ ๊ตฌํ•œ ๋ฌธ๋งฅ์—์„œ ์—ฐ์†ํ•ด์„œ ๋‚˜์˜ค๋Š” ์ˆซ์ž๋“ค์˜ ๊ฐฏ์ˆ˜์™€ ํ•ด๋‹น ์ˆซ์ž๋ฅผ ์ด์–ด๋ถ™์ธ ๋ฌธ์ž์—ด์„ ๊ตฌํ•˜๊ณ , n๊ฐ’์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์ข€ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ณ€์ˆ˜๋ช… num์— ํ•ด๋‹นํ•˜๋Š” ๋ณ€์ˆ˜๋Š” ํ˜„์žฌ๊นŒ์ง€ ๊ตฌํ•œ ๋ฌธ๋งฅ์„ ์˜๋ฏธํ•˜๋ฏ€๋กœ, context๋‚˜ current_context์™€ ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋” ๋ช…ํ™•ํ•ด์ง‘๋‹ˆ๋‹ค.

๋˜ํ•œ, while๋ฌธ์˜ ์กฐ๊ฑด์‹์—์„œ ์“ฐ์ธ left, right์™€ ๊ฐ™์€ ๋ณ€์ˆ˜๋“ค์€ while๋ฌธ ์•ˆ์—์„œ๋งŒ ์“ฐ์ด๋Š” ์ง€์—ญ ๋ณ€์ˆ˜์ด๋ฏ€๋กœ, ๋ฐ˜๋ณต๋ฌธ์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๋ฏธ๋ฆฌ ์„ ์–ธํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์Šต๊ด€์„ ๋“ค์ด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ, ์ฝ”๋“œ์˜ ์ˆ˜์ •๋œ ๋ฒ„์ „์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

class Solution:
    def countAndSay(self, n: int) -> str:
        if n == 1:
            return '1'

        curr = 1
        current_context = '1'
        result = ''

        while curr < n:
            left = right = 0
            answer = ''

            while right < len(current_context):
                s = current_context[left]
                count = 0

                while right < len(current_context) and current_context[right] == s:
                    count += 1
                    right += 1

                answer += f'{count}{s}'
                left = right

            current_context = answer
            curr += 1

        return answer

์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์ ธ ๋”์šฑ ๋ณด๊ธฐ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•

'๐Ÿข One step' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

How to LeetCode effectively  (0) 2023.05.10
[leetcode-706] Design HashMap  (0) 2023.05.09
[leetcode-48] Rotate Image  (0) 2023.04.30
[leetcode-347] Top K Frequent Elements  (0) 2023.04.27
[leetcode-43] Multiply Strings  (0) 2023.04.26
๋‹คํ–ˆ๋‹ค