백준 11478

김금동·2024년 8월 21일
0

알고리즘

목록 보기
14/15

발상은 맞았지만 풀이과정이 맘에 들지 않았다.

  1. 왠지 모르게 늘어진 코드
  2. 변수의 복잡함
import sys

S = sys.stdin.readline().rstrip()

set1 = set()
l=len(S)
i = 1
while i <= l:
    for k in range(l):
        if k+i <= l:
            set1.add(S[k:k+i])
        else:
            pass
        
    i+=1
        
print(len(set1))
  1. 왠지 모르게 늘어진 코드
    이건 while 문을 썼기 때문이다. while문을 쓰면서 변수를 미리 지정하면서 코드 추가하고(i=1부분), while문에 들어가는 변수를 계속해서 바꿔줘야하니까 코드 추가하고 (i+=1부분) 그러면서 코드가 늘어졌다.

그럼 왜 while문을 썼나?
=> 이 문제는 문자열을 부분으로 슬라이싱하여 세트에 추가하는 문제인데 부분으로 나누려면 왼쪽과 오른쪽 변수를 두어야 했다. 이 때 왼쪽 변수를 두는걸 while문으로 차례로 더하면서 자르려고 했는데 while문을 쓰면 이렇게 코드가 늘어질지 몰랐다.

그럼 어떻게 하는게 좋을까?
=> while문 대신 for 문을 이용하여 왼쪽 변수를 설정하면 변수를 미리 지정할 필요도 없고 변수를 계속해서 바꿔줘야하는 코드를 없앨 수 있다.

무엇을 알았나?
=> while문 for문 둘다 내가 설정하고 싶은 변수 하나를 특정해주는 수단이라는 것을 알았다. 그러나 while문은 for문보다 코드가 더 추가되어야 하는 부분들로 인해 코드가 늘어질 수 있다. 그러므로 변수를 특정할 때, 코드를 더 간편화하기 위해서는 while문보다는 for문을 쓰는게 좋다.

  1. 변수의 복잡함
    세트에 추가하기 위한 문자열의 슬라이싱을 할 때 변수가 k, k+i 로 한번에 보기가 복잡하다. k+i가 하나의 문자로 되었으면 더 파악하기 쉬웠을텐데.

그럼 왜 k+i가 되었을까?
=> 구하려는 순서때문에 그렇다. 1개짜리부터 모두 구하려고 하니까 왼쪽 변수가 계속해서 움직여야 해서 오른쪽 변수가 k+i 로 같이 움직여야 했다. 그러니까 a,b,c,d 이렇게 구하려고 했기 때문인데. 만약 a,ab,abc,abcd a를 기준점으로 잡고 구하였다면 오른쪽 변수만 움직이기 때문에 변수가 하나가 될 수 있었다.

무엇을 알았나?
=> 두 변수가 움직이면서 슬라이싱할 때 최대한 하나는 고정하여 슬라이싱할 수 있도록 하면 변수를 간편화할 수 있다.

최종코드

import sys

S = sys.stdin.readline().rstrip()

set1 = set()

data_length = len(S)
for i in range(data_length):
    for j in range(i+1, data_length+1):
        set1.add(S[i:j])
    
print(len(set1))
profile
나원래chu해

0개의 댓글