PROGRAMMING/Algorithm

[LeetCode] 38. Count and Say (python)

KIM DEON 2022. 6. 6. 17:06

https://leetcode.com/problems/count-and-say/

 

Count and Say - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com


๐Ÿ“ Problem

count-and-say sequence๋Š” ์žฌ๊ท€์ ์œผ๋กœ ์ •์˜๋œ ์ˆซ์ž ๋ฌธ์ž์—ด๋กœ,

- countAndSay(1) = '1' ๋กœ ์‹œ์ž‘ํ•ด์„œ, 

- countAndSay(n) ์€  countAndSay(n-1) ๋ฅผ ์ฝ์€ ๋ฌธ์ž์—ด์„ ์ˆซ์ž๋กœ ํ‘œํ˜„ํ•œ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด

Input n=2 ์ธ ๊ฒฝ์šฐ, 

countAndSay(2) ๋Š” countAndSay(1)์˜ ๊ฒฐ๊ณผ๊ฐ’ '1' ์˜ ์ˆซ์ž๋“ค์„ countํ•ด ๋ฌธ์žฅ์œผ๋กœ ๋งŒ๋“  ๊ฒฐ๊ณผ๊ฐ’์ด๋‹ค.

-> '1๊ฐœ์˜ 1' ๋งŒ ์žˆ์œผ๋ฏ€๋กœ countAndSay(2) = '11' ์ด ๋œ๋‹ค.

 

n=3์ธ ๊ฒฝ์šฐ,

countAndSay(2) = '11' ๋ฅผ '2๊ฐœ์˜ 1' ๋กœ ์ฝ์–ด ๊ฒฐ๊ณผ๊ฐ€ '21' ์ด ๋œ๋‹ค.

 

* ์ฃผ์˜ํ•  ์ ์€ ์ˆซ์ž count๋Š” ๊ฐ™์€ ์ˆซ์ž๊ฐ€ ์—ฐ์†์ ์œผ๋กœ ์ด์–ด์งˆ ๋•Œ๊นŒ์ง€๋งŒ ์œ ํšจํ•˜๋‹ค. 

 

์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ countAndSay(n-1)  = '111221' ์ธ ๊ฒฝ์šฐ,

countAndSay(n)์€ '3๊ฐœ์˜ 1, 2๊ฐœ์˜ 2, 1๊ฐœ์˜ 1' ๋กœ, '312211' ๊ฐ€ ๋œ๋‹ค. 


๐Ÿ’ก Solution

n๋ฒˆ์งธ countAndSay ๊ฐ’์„ ๊ตฌํ•˜๋ ค๋ฉด n-1์˜ countAndSay ๊ฐ’์ด ํ•„์š”ํ•˜๋‹ค.

์ˆซ์ž ๋ฌธ์ž์—ด์„ countํ•˜๊ณ  ์ฝ๋Š” ํ•จ์ˆ˜ (readString())๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ , ์ด๋ฅผ n-1 ๋ฒˆ ๋ฐ˜๋ณตํ•˜๋Š” ํ˜•์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

 

readString() ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ ์•ž์„  ๋ฌธ์ž(prev)์™€ ํ˜„์žฌ ๋ฌธ์ž๋ฅผ ๋น„๊ตํ•˜์—ฌ ๋™์ผํ•œ ๊ฒฝ์šฐ ๊ฐฏ์ˆ˜(cnt)๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ , 

๋‹ค๋ฅธ ๊ฒฝ์šฐ ๊ฒฐ๊ณผ string (res)์— ์ง€๊ธˆ๊นŒ์ง€ countํ•œ ๋ฌธ์ž์™€ ๊ฐฏ์ˆ˜๋ฅผ ์ €์žฅํ•œ๋‹ค. 

 

class Solution(object):
    def countAndSay(self, n: int) -> str:
        say = '1' # n: 1 -> say: '1'

        # ์ด์ „ say๊ฐ’์„ ์ฝ์–ด n๋ฒˆ์งธ say๊ฐ’์„ ๊ตฌํ•œ๋‹ค. 
        # (์ด๋ฏธ 1์— ๋Œ€ํ•œ say ๊ฐ’์€ ๊ตฌํ•ด์ง„ ์ƒํƒœ์ด๋ฏ€๋กœ n-1๋ฒˆ ๋ฐ˜๋ณต)
        for i in range(1, n):
            say = self.readString(say)

        return say

    def readString(self, seq: str) -> str:
        res = ''
        prev = '' 
        cnt = 0
        for i in range(len(seq) + 1):

            # ์ฒซ ๋ฌธ์ž์˜ ๊ฒฝ์šฐ prev ๋ฌธ์ž๋ฅผ ์ฒซ ๋ฌธ์ž๋กœ ์ €์žฅํ•˜๊ณ  ๋„˜์–ด๊ฐ„๋‹ค.
            if i == 0:
                prev = seq[i]
                cnt += 1

            # string์ด ๋๋‚˜๋ฉด ํ˜„์žฌ prev ๋ฌธ์ž์™€ cnt๋ฅผ ๊ฒฐ๊ณผ์— ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋๋‚ธ๋‹ค. 
            elif i == len(seq):
                res += (str(cnt) + prev)
            
            # ๋ฌธ์ž๊ฐ€ ์ด์ „ ๋ฌธ์ž์™€ ๊ฐ™์€ ๊ฒฝ์šฐ, cnt๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ 
            # ๋‹ค๋ฅผ ๊ฒฝ์šฐ res๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๊ณ  prev์™€ cnt๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. 
            else:
                if prev == seq[i]:
                    cnt += 1
                else:
                    res += (str(cnt) + prev)
                    prev = seq[i]
                    cnt =  1
        return res