작심삼일

[LeetCode] 38 | Count and Say | Python 본문

스터디/코테

[LeetCode] 38 | Count and Say | Python

yun_s 2022. 10. 18. 09:14
728x90
반응형

문제 링크: https://leetcode.com/problems/count-and-say/


문제

The count-and-say sequence is a sequence of digit strings defined by the recursive formula:

  • countAndSay(1) = "1"
  • countAndSay(n) is the way you would "say" the digit string from countAndSay(n-1), which is then converted into a different digit string.

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.

For example, the saying and conversion for digit string "3322251":

Given a positive integer n, return the nth term of the count-and-say sequence.


조건

  • 1 <= n <= 30

내 풀이

문제에서 주어진 대로 행동하도록 코드를 짜면 된다.

현재 string을 앞에서부터 읽으며 같은 숫자가 연속된다면 그 숫자와 반복된 횟수를 저장하고, 다른 숫자가 나올 때 이전까지 반복된 횟수와 그 숫자를 새로운 string(new_string)에 저장한다.

현재 string의 모든 숫자에 대해 위와 같은 연산을 끝냈다면, new_string을 string으로 바꾼 뒤 이를 n-1번 반복한다.

n-1번 반복하는 이유는, 문제에서 주어진 예시를 참고해보면 n=1일 때는 그대로 리턴하기 때문에 맨 처음 한번을 빼야하기 때문이다.


코드

class Solution:
    def countAndSay(self, n: int) -> str:
        string = '1'
        
        for i in range(n-1):
            past = string[0]
            count = 1
            new_string = ''
            
            for digit in string[1:]:
                if digit == past:
                    count += 1
                else:
                    new_string += str(count) + str(past)
                    past = digit
                    count = 1
            
            new_string += str(count) + str(past)
            string = new_string
        
        return string
728x90
반응형
Comments