Python: Code Taka 1주차 3

dev-swd·2020년 11월 15일
0

Code Taka

목록 보기
3/12
post-thumbnail

Q. String 형인 str 인자에서 중복되지 않은 알파벳으로 이루어진 제일 긴 단어의 길이를 반환해주세요.

str = "abcabcabc"
return3
=> 'abc' 가 제일 길기 때문

str = "aaaaa"
return1
=> 'a' 가 제일 길기 때문

str = "sttrg"
return3
=> 'trg' 가 제일 길기 때문

나의 답(풀었던 방식)

def get_len_of_str(string):
  if not string:
    return 0
  
  chars = ""
  count_list = []
  for char in string:
    if chars.find(char) != -1:
      count_list.append(len(chars))
      chars = ""
      chars += char
    else:
      chars += char
  
  if chars:
    count_list.append(len(chars))
  
  count_list.sort(reverse=True)
  return count_list[0]
  1. 먼저 스트링값에 아무것도 빈 값이 오는 경우 예외 처리 (테스트 코드에서 오류를 발생시키기 때문에 추가하였다)

  2. 중복된 문자가 없다면 chars 라는 변수에 계속 값을 붙여준다.

  3. 반복문으로 검사하는 문자 값 char 가 chars 에서 발견된다면, 이제까지 쌓아왔던 chars 의 길이를 count_list 에 저장한다. 그리고 chars 를 초기화 시키고, 중복된 시점의 char 에 이어지는 문자가 중복되지 않을 수 있으므로 해당 문자를 다시 chars 에 붙여준다.

  4. 반복문이 끝난 후 chars 가 유효하다면 count_list 의 끝에 chars의 길이 값을 넣어준다. (중복되지 않았을 때 chars 에 더 긴 값이 있을 수 있기 때문에 체크를 넣어주었다.)

  5. 그 후 count_list 를 큰 값을 기준으로 정렬하여 0번째 값을 리턴하였다.

소감

깔끔하지 못한 코드. 답을 내기 위한 코드.


2021-01-30 수정

블로그 정리 하면서 알고리즘 문제도 다시 풀어보고 있는데, 올렸던 답은 좀 문제가 있네요. 알고리즘 공부를 꾸준히 하지 않아 크게 성능이 올라갈 것 같지 않지만, 마지막에 정렬 함수와 인덱스 0은 좀 불필요한 처리이다..

아,, 코드가 달라진 점은 테스트 코드를 작성하기 시작했다는 것이다. 이에 더해서 커버리지도 같이 해보려고 했는데, 애초에 커맨드라인으로는 테스트 코드가 실행이 안되는 이슈가 있다. IDE 로는 잘 되는데, 어째서 커맨드라인으로는 안되는지 참 궁금하다..

import unittest
from python.utils import CommonUtils


class Solution:
    
    @CommonUtils.logging_time
    def most_longest_word_1(self, words: str) -> int:
        
        if not words:
            return 0
        
        chars = ''
        max_count = 0
        
        for word in words:
            
            if chars.find(word) != -1:
                
                if max_count < len(chars):
                    max_count = len(chars)
                
                chars = ''
                chars += word
                continue
                
            chars = chars + word
        
        if max_count < len(chars):
            return len(chars)
        
        return max_count
    
    @CommonUtils.logging_time
    def most_longest_word_2(self, words: str) -> int:
        
        if not words:
            return 0
        
        chars = ''
        count_list = []
        
        for word in words:
            
            if chars.find(word) != -1:
                count_list.append(len(chars))
                chars = ''
                chars += word
                continue
                
            chars = chars + word
        
        return max(count_list)
    

class TestSolution(unittest.TestCase):
    
    def setUp(self) -> None:
        self.solution = Solution()
    
    def test_1_most_longest_word_1(self):
        case = "abcabcabc"
        
        self.assertEqual(
            3,
            self.solution.most_longest_word_1(case)
        )
    
    def test_2_most_longest_word_1(self):
        case = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
        
        self.assertEqual(
            1,
            self.solution.most_longest_word_1(case)
        )
    
    def test_3_most_longest_word_1(self):
        case = "sttrg"
        
        self.assertEqual(
            3,
            self.solution.most_longest_word_1(case)
        )
    
    def test_4_most_longest_word_1(self):
        case = ""
        
        self.assertEqual(
            0,
            self.solution.most_longest_word_1(case)
        )
    
    def test_5_most_longest_word_1(self):
        case = "aaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
        
        self.assertEqual(
            2,
            self.solution.most_longest_word_1(case)
        )


if __name__ == '__main__':
    unittest.main()
profile
개발을 취미로 할 수 있는 그 때 까지

0개의 댓글

관련 채용 정보