본문 바로가기

Algorithm

[프로그래머스(LV2), JAVA]문자열 압축

문제를 보자

입력받은 문자열이 연속된 숫자만큼 앞에 숫자를 적고 뒤에 연속된 문자열을 넣어주는 식의 문제이다.

중복된 문자열을 삭제하고, 연속된 만큼 숫자를 적어주면 가장 짧은 길이의 문자열이 되는데, 그 길이를 반환해주면 된다.

 

예시를 보자.

입력값 #2 에서 "ababcdcdababcdcd"는 총 16자리의 문자로, 8개의 문자로 잘라주면 ababcdcd가 2번 연속나오기 때문에 "2ababcdcd"가 되어 총 길이가 9인 문자열이 된다.

 

그러면 어떻게 풀어나가면 좋을까?

 

일단, 하나부터 문자열의 길이의 반만큼까지 문자열을 잘라 비교해본다.

만약 입력값 #2를 예시로 들면, 1개의 문자로 나누어 버리면 다음 b와 비교 후 그 다음 a를 다시 그 다음 값과 비교해야 한다.

그렇기에 다음 시작값에 문자를 자른 만큼 더해 비교할 수 있다.

0번째 index이면 다음 비교는 2번째 index에서 비교한다.)

 

비교할 대상인 diff와 word를 사용해 만약 같으면 count를 +1, count가 1이라면 숫자 1를 제외하고 문자열만 붙여주고, 다르다면 중복된 숫자 + 중복된 문자열을 StringBuilder를 사용해 붙여준다.

 

그리고 다음 문자 비교를 위해 diff를 word로, count는 다시 1로 초기화 해준다.

 

마지막으로 자른 문자열인 word가 자르는 i만큼 남아있지 않다면 그대로 출력시키고,  StringBuilder에서 적은 값들 중 가장 길이가 작은 값을 answer로 둔다.

 

결과는?

성공이다!