str = "abcabcabc"
return은 3
=> 'abc' 가 제일 길기 때문
str = "aaaaa"
return은 1
=> 'a' 가 제일 길기 때문
str = "sttrg"
return은 3
=> '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]
먼저 스트링값에 아무것도 빈 값이 오는 경우 예외 처리 (테스트 코드에서 오류를 발생시키기 때문에 추가하였다)
중복된 문자가 없다면 chars 라는 변수에 계속 값을 붙여준다.
반복문으로 검사하는 문자 값 char 가 chars 에서 발견된다면, 이제까지 쌓아왔던 chars 의 길이를 count_list 에 저장한다. 그리고 chars 를 초기화 시키고, 중복된 시점의 char 에 이어지는 문자가 중복되지 않을 수 있으므로 해당 문자를 다시 chars 에 붙여준다.
반복문이 끝난 후 chars 가 유효하다면 count_list 의 끝에 chars의 길이 값을 넣어준다. (중복되지 않았을 때 chars 에 더 긴 값이 있을 수 있기 때문에 체크를 넣어주었다.)
그 후 count_list 를 큰 값을 기준으로 정렬하여 0번째 값을 리턴하였다.
깔끔하지 못한 코드. 답을 내기 위한 코드.
블로그 정리 하면서 알고리즘 문제도 다시 풀어보고 있는데, 올렸던 답은 좀 문제가 있네요. 알고리즘 공부를 꾸준히 하지 않아 크게 성능이 올라갈 것 같지 않지만, 마지막에 정렬 함수와 인덱스 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()