https://school.programmers.co.kr/learn/courses/30/lessons/60057
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제
알파벳으로 된 문자열중 연속된 중복이 일어나는 문자들을 숫자로 묶어 문자열 길이를 최소로 만드는 문자열을 리턴하는 문제이다. 이때 단위만큼씩 중복검사를 한다.
입력
문자열 s (1 <= len(s) <= 1000) , s 는 알파벳 소문자이다.
출력
압축된 문자열중 가장 작은 문자열을 리턴하라.
풀이
1부터 문자열 길이까지 의 단위로 묶어서 for 문을 각각 돌린다.
해당 단위만큼 앞으로 가면서 바로전 단위만큼의 문자열이 현재와 중복되는지 검사를 한다.
중복된다면 중복 변수에 1씩 더해 준다.
만약 가다가 중복이 안되는 문자열 이 나온다면 중복 변수가 0보다 큰지 확인한후 (즉 중복이 되었었는지 확인) 중복이 있었으면 중복 변수의 문자열 길이와 중복되었던 그전 문자열의 길이를 더해준다. 이러면 만약 "abab" , 단위 2 일때 2ab 이므로 총 3이다. 이는 (중복변수) 1 + (그전 문자열 길이 ab) 2 = 3 과같다.
이렇게 더해준 각 단위마다의 값들중 가장 작은 수를 구해내면 된다.
def solution(s):
s+= ' ' # string s 에 마지막 을 구분하기위해 공백을 넣는다.
slen = len(s) # 문자열 s 의 길이 slen
mins = 1001
for unit in range(1,slen): # 각 단위를 다 돌기위해 slen 만큼 1부터 돈다.
cnt = 0 # 중복 변수
resCnt = 0 # 각 단위마다의 총 길이
prevWords = s[:unit] # 단위 만큼의 이전 문자열
words = '' # 현재 문자열
for idx in range(unit,slen): # 위에 단위만큼 이전 문자열을 만들었으므로 단위 만큼 의 이후부터 시작한다.
word = s[idx] # 현재 문자
words += word # 현재 문자열에 더해준다.
if (idx + 1) % unit == 0 or word == ' ': # 현재 문자열이 단위만큼 채워졌으면 혹은 마지막에 다달았으면 if문으로 들어간다.
if words == prevWords: # 현재 문자열과 이전 문자열이 중복될때
cnt += 1 # 중복 변수를 1 더해준다.
elif cnt >= 1: # 중복안될때 중복이 있었으면
resCnt += len(prevWords) + len(str(cnt+1)) # 이전 문자열과 중복 변수 문자열의 길이를 더해준다.
cnt = 0 # 중복을 처음부터 시작해야하므로 초기화해준다.
else: # 중복 없었으면
resCnt += len(prevWords) # 중복 변수 즉 숫자를 넣을필요가 없으므로 이전 문자열의 길이만 넣어준다.
cnt = 0
if word == ' ': # 만약 마지막에 도착한다면 마지막 공백을뺀 현재 문자열의 길이를 더해준다.
resCnt += len(words[:-1])
prevWords = words # 현재 문자열을 이전문자열로 넣어준다.
words = '' # 초기화
mins = min(mins,resCnt) # 해당 단위의 길이와 가장 작은 길이 각각을 비교하여 가장 작은 길이를 찾는다.
return mins # 가장 작은 길이를 리턴한다.
'알고리즘' 카테고리의 다른 글
프로그래머스/전화번호 목록/py (0) | 2022.08.23 |
---|---|
백준/가장 가까운 세 사람의 심리적 거리/py (0) | 2022.08.22 |
프로그래머스/주차 요금 계산/py (1) | 2022.08.20 |
프로그래머스/올바른 괄호/py (0) | 2022.08.17 |
프로그래머스/신규 아이디 추천/py (0) | 2022.08.17 |