#11478

zzwwoonn·2022년 5월 29일
0

Algorithm

목록 보기
38/71

첫 번째 풀이

inputStr = input()
lenStr = len(inputStr)
strList = []


for i in range(1, lenStr+1):
    # print("길이 ", i, " 짜리 만들기 ")

    makeStr = ""
    for j in range(0, lenStr-i+1):
        # print("j = ", j)
        k = j
        while(len(makeStr) != i):
            makeStr += inputStr[k]
            k += 1

        # print("makeStr = ", makeStr)
        strList.append(makeStr) 
        makeStr = ""

        # print("strList = ", strList)

# print("strList = ", strList)
convertSet = set(strList)
# print("convertSet = ", convertSet)
answerList = list(convertSet)
# print("answerList = ", answerList)
print(len(answerList))

3중 루프 => 시간 초과

i가 1부터 입력 문자열의 길이 만큼 돌면서, 현재 위치를 기억하고
길이가 1인, 2인, 3인, 4인, 5인 (만약 입력 문자열의 길이가 5라면) 문자열을 모두 구하는 방식이다. 풀면서도 이건 아니겠지 라는 생각을 했지만 그래도 끝까지 해서 답까지 내봤다.

이렇게 말고 뭔가 다른 풀이가 있지 않을까? 조금 더 고민했다.
문자열을 한번만 돌면서 그기서 한번만 더 돌면 2중 루프로 될 거 같다라는 생각을 했고

두 번째 풀이

inputStr = input()
lenStr = len(inputStr)
strList = []

# print("??? = ",inputStr[2:2])
for i in range(0, lenStr):
    for j in range(i, lenStr+1):
        if i == j:
            continue
        strList.append(inputStr[i:j])
        # print(strList)

# print("strList = ", strList)
convertSet = set(strList)
# print("convertSet = ", convertSet)
answerList = list(convertSet)
# print("answerList = ", answerList)
print(len(answerList))

문자열을 돌면서 해당 문자열로 시작할 수 있는 가능한 모든 문자열을 뽑는 것이다. 그럼 2중 반복문으로 풀 수 있다.

추가로 리스트에서 중복제거를 하기 위해서는 배열을 set으로 바꿔주고 이걸 다시 배열로 바꿔주면 된다.

strList : 내가 구한 배열 (중복 제거를 하고 싶은 배열)
convertSet = set(strList)
answerList = list(convertSet)

0개의 댓글