티스토리 뷰
1. 문제
2. 소스코드 (Python3)
def solution(s): # wordlen=len(s)이면 압축문자열 길이 = len(s) answer = len(s)
for wordlen in range(1, len(s)-1): #문자길이가 1~len(s)-1까지 반복. wordcnt = len(s)//wordlen #문자뭉텅이 개수 = 전체문자열길이에서 문자길이 나눈 몫 comp = False #False=압축x, True=압축o compcnt = 0 #압축되는 문자뭉텅이 개수 compstr = '' #압축된 문자열 for j in range(wordcnt): word1 = s[j*wordlen: (j+1)*wordlen] word2 = s[(j+1)*wordlen: (j+2)*wordlen] if j==wordcnt-1: word2 = s[(j+1)*wordlen:] #마지만 뭉텅이 예외처리 if word1 == word2: #앞 문자와 뒤 문자가 같으면 if not comp: comp, compcnt = True, 1 #압축x였던 경우: 압축설정 compcnt += 1 #압축되는 문자개수 +1 else: if comp: compstr += str(compcnt) #압축o인 경우: 앞에 압축되는 문자 개수 써주기 comp, compcnt = False, 0 #압축설정 해제 compstr += word1 #문자열 더함 ##마지막 문자 뭉텅이 처리 if comp: compstr += str(compcnt) #압축o인 경우: 앞에 압축되는 문자 개수 써주기 compstr += word2 #문자열 더함 ##문자열 길이 중 최소인 것 answer에 담기 if answer > len(compstr): answer = len(compstr)
return answer |
3. 고찰
1) 변수 소개
문자열 s에 대해서 1~s의 길이만큼 나누어 압축한다. 주의할 점은 문자열이 꼭 같은 개수로 나누어질 필요가 없다는 점이다. 마지막 남은 문자들을 하나의 뭉텅이로 처리한다.
wordlen : 문자뭉텅이의 길이 (ex. 3)
wordcnt : 문자뭉텅이의 개수 (ex. 4)
comp : 압축되는지 여부. 압축되면 True, 안되면 False. default=False
compcnt : 압축되는 문자뭉텅이 개수
compstr : 압축된 문자열
2) 알고리즘
문자열의 길이만큼의 길이로 압축하면 압축문자열은 문자열 그대로이다. 이때 압축문자열길이 = 문자열길이 이다.
첫 answer에 문자열길이를 저장한다.
문자뭉텅이 길이가 1 ~ len(s)-1까지 반복한다. len(s)인 경우는 위에서 처리함.
문자뭉텅이 개수(wordcnt)는 전체 문자열 길이 ÷ 문자뭉텅이 길이의 몫이다.
초기 압축 설정을 해준다.
## j번째 문자뭉텅이 처리
for문을 돌면서 각 문자뭉텅이에 대해서 다음 문자뭉텅이와 같은지 비교한다.
word1은 앞의 문자뭉텅이. wordlen길이의 문자열
word2는 이어지는 뒤의 문자 뭉텅이. wordlen길이의 문자열
word2의 경우, 맨 마지막 뭉텅이면 길이가 다르기 때문에 예외처리하였다.
앞 문자뭉텅이와 뒤 문자뭉텅이가 같으면 압축설정
이전까지 압축x였던 경우는 새로 압축설정을 해준다.
압축되는 문자개수 +1
앞 문자뭉텅이와 뒤 문자뭉텅이가 다른 경우 압축해제 및 문자열 더하기
이전까지 압축o였던 경우는 압축설정을 해제한다.
문자열을 더해준다.
## 마지막 문자뭉텅이 처리
위와 같이 처리함.
최종적으로 압축문자열 길이를 계산하여 최소인 것을 answer에 저장한다.
3) 시간복잡도
입력 문자열의 길이를 N이라 할 때,
압축문자열길이가 1~N인 경우를 모두 조사한다. (N번 수행)
그 안에서 각 문자뭉텅이 개수만큼 for문을 돌린다.
문자 뭉텅이 개수는 매번 다르지만, 1~N까지 있으므로 평균 N/2라고 잡을 수 있을 것 같다. (N/2번 수행)
따라서 이 코드의 시간복잡도는 O(N*N/2) = O(N^2)이다.
'프로그래밍 > Python' 카테고리의 다른 글
프로그래머스 - 체육복 (0) | 2020.12.03 |
---|---|
프로그래머스 - 완주하지 못한 선수 (0) | 2020.12.03 |
프로그래머스_H-Index (0) | 2020.11.03 |
Quick Sort 파이썬 구현 (0) | 2020.11.02 |
프로그래머스_조이스틱 (0) | 2020.11.02 |
- Total
- Today
- Yesterday
- set backspace
- HC-SR04
- 초음파센서
- 프로그래머스
- python3
- subscriber
- umount
- 우분투
- Python
- 아두이노 IDE
- 윈도우 복구
- Ubuntu16.04
- 리눅스
- ROS
- Ubuntu20.04
- 8자주행
- sensehat
- VMware
- filesystem
- 포트인식문제
- 코드리뷰
- Mount
- roslaunch
- 백준알고리즘
- 원격 통신
- Publisher
- VirtualBox
- 윈도우
- vue/cli
- C++
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |