로직
1. s를 돌면서 앞에 값이랑 뒤에 값이랑 비교한다. 이때, 1~len(s)//2+1 개까지 돌리면서비교한다.
- len(s)의 반만 돌아도 괜찮다. 어차피 최대가 ababcdcdababcdcd->2ababcdcd이기때문
2. temp라는 빈 문자열을 두고, i(1~len(s)//2+1)가 돌때마다 새롭게 만들어지는 문자열의 갯수를 비교할 것이다.
3. cnt는 같은 앞에 값이랑 뒤에 값이 같을때마다 더해주고, cnt=1일때는 그냥문자만 temp에 넣고, cnt가 1보다 크다면 cnt와 문자 둘다 넣는다
4. 그리고 나서 cnt를 다시 초기화해준다. -> aabbacc에서 2a3b로 나왔다. 이는 cnt가 제때 갱신이 되지 않아서임
5. 그리고 앞에 값을 뒤에값으로 바꿔준다. -> 앞에 값을 뒤의 값으로 바꿔줘야 그 뒤에값이랑 비교해나갈 수 있다.
6. len(s) == 1이면 ans = 1로 둔다.
코드
def solution(s):
ans = 999999999999999999999999999999
if len(s) == 1:
return 1
for i in range(1, len(s) // 2 + 1): # len(s)의 반만 돌아도 괜찮다. 어차피 최대가 2s의반
temp = ''
cnt = 1
front = s[:i]
for j in range(i, len(s) + i, i):
# 여기서 len(s)를 하면 aabbaccc에서 2a2ba까지 나오고 3c가 나오지 않음.
# why? j가 i만큼 건너뛰면서 나타나는데 이때 끝까지 가지 못해서임
ss = s[j:j + i]
if front == ss:
cnt += 1
else:
if cnt == 1:
temp += front
else:
temp += str(cnt) + front
cnt = 1 # aabbacc에서 2a3b로 나왔다. 이는 cnt가 제때 갱신이 되지 않아서임
front = ss # 앞에 값을 뒤의 값으로 바꿔줘야 그 뒤에값이랑 비교해나갈 수 있다.
if ans > len(temp):
ans = len(temp)
# print(ans)
return ans
주의할 점
1. i를 얼마나 돌려야 하나?
- s를 돌면서 앞에 값이랑 뒤에 값이랑 비교한다. 이때, 1~len(s)//2+1 개까지 돌리면서비교한다.
- len(s)의 반만 돌아도 괜찮다. 어차피 최대가 ababcdcdababcdcd->2ababcdcd이기때문
2.
** 문제점 : 맨 앞에 aabbacc일 때 맨 앞에 2a가 들어와야하는데 두번째 a부터 들어온다
for i in range(1, len(s) // 2 + 1):
temp = ''
cnt = 1
front = s[:i]
for j in range(i+1, len(s), i):
ss = s[j:j+i]
** 해결책
for i in range(1, len(s) // 2 + 1):
temp = ''
cnt = 1
front = s[:i]
for j in range(i, len(s), i):
ss = s[j:j+i]
3.
** 문제점 : aabbaccc에서 2a2ba까지만 나온다
for i in range(1, len(s) // 2 + 1):
temp = ''
cnt = 1
front = s[:i]
for j in range(i, len(s), i):
ss = s[j:j+i]
** 해결책
for i in range(1, len(s) // 2 + 1):
temp = ''
cnt = 1
front = s[:i]
for j in range(i, len(s) + i, i):
ss = s[j:j+i]
# j가 i만큼 건너뛰면서 나타나는데 이때 마지막 값까지 가지 못한다. why? i가 반만 도니까!!
'알고리즘' 카테고리의 다른 글
[programmers] 카카오프렌즈 컬러링북 (0) | 2020.08.11 |
---|---|
[programmers] 가장 큰 수 (0) | 2020.08.11 |
[programmers] 소수찾기(12921) (0) | 2020.07.08 |
[programmers] 문자열 다루기 기본 (0) | 2020.07.08 |
[programmers] 문자열 내 마음대로 정렬하기 (0) | 2020.07.08 |