일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- telegram
- data_engineer
- leetcode
- Dynamic Programming
- hackerrank
- BOT
- 데이터 엔지니어
- 알고리즘
- SQL
- 2023년 목표
- 프로그래머스
- delete join
- Airflow
- 그리디
- docker
- docker container
- Spark
- 백준온라인저지
- airflow webserver
- Data Engineering
- 백준 온라인 저지
- 빅데이터를 지탱하는 기술
- airflow architecture
- Pseudo Lab
- datacamp
- Python
- MySQL
- dsf
- terraform
- docker image
Archives
- Today
- Total
Lim Seunghyun Space
[프로그래머스] 문자열 압축 본문
문제 링크
문제 해설
- 문자열 s을 n개 단위로 잘라서 압축해서 생성한 문자열의 최소 길이를 구하기 (n = 1,2,3,4,..)
나의 풀이 (Python)
def solution(s):
answer = 1001
for i in range(1, len(s) + 1):
comp = ""
count = 1
previous = ""
for j in range(0, len(s), i):
part = s[j:j+i]
if j == 0:
previous = part
else:
if previous == part:
count += 1
else:
if count == 1:
comp += previous
else:
comp += str(count) + previous
previous = part
count = 1
if count == 1:
comp += previous
else:
comp += str(count) + previous
answer = min([len(comp), answer])
return answer
- s의 길이는 1000 이하 이면서 최솟값을 구해줄 것이기 때문에 answer은 1000 +1 로 초기화
- 1부터 문자열의 길이만큼 반복해서 각 케이스마다 생성되는 문자열의 길이를 계산
- s = "abab"라면 1부터 4까지 반복 => for i in range(1, len(s) + 1)
- 문자열의 길이를 초과하는 수로 문자열을 나누는건 의미가 없음
- s = "aba"이고, 4개씩 문자열을 나누는 것은 3개씩 문자열을 나누는 것과 동일
- comp에는 압축한 문자열을 담고, previous는 이전 문자열을 보관할 임시 변수, count는 previous변수와 얼마나 동일한지 카운팅을 해줄 변수
- 문자열 분할에서 인덱스는 range을 이용
- range(n, m, l) -> n부터 m-1까지 l씩 띄움
- 압축 로직
- part에 분할된 문자열을 보관하고, previous와 비교하여 같으면 count를 1 증가하고 아니라면 압축한 문자열을 comp에 더 해주는 방식으로 진행
Github : https://github.com/Limseunghyun95/code_test/blob/master/programmers/p_60057.py
728x90
'Algorithm > 문제' 카테고리의 다른 글
[백준 온라인 저지] 진법 변환 (0) | 2021.12.30 |
---|---|
[Leetcode] Climbing stairs (0) | 2021.12.13 |
[HackerRank] Validating Roman Numerals (0) | 2021.11.21 |
[백준 온라인 저지] 01타일 (0) | 2021.11.11 |
[백준 온라인 저지] 유기농 배추 (0) | 2021.11.10 |