Coding/알고리즘
[알고리즘 TIL] 문자열 합치기
kangplay
2025. 4. 17. 15:07
문제
https://school.programmers.co.kr/learn/courses/30/lessons/60057?language=java
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
트러블 슈팅
이 문제는 단순 구현이지만, 구현 전에 경우의 수에 따른 시나리오를 잘 짜서 빈틈없이 구현하는 게 중요했다.
1. 압축 단위를 1 ~ s.length()/2까지 순회하면서,
2. 문자열을 그 단위로 잘라가며:
이전 조각(pre)과 다음 조각(next)을 비교
같으면 count++
다르면 (count > 1이면 count + pre, 아니면 pre만 저장)
3. 문자열이 끝났을 때 남은 조각과 count까지 처리
4. 가장 짧은 압축 길이를 업데이트
또한, 마지막에 1를 제거하려고 했지만, 1 뿐만 아니라 10, 11 같이 1 포함 다른 수들에서도 1이 없어지는 오류가 발생해서, replace 대신 count > 2 일 때만 count를 문자열로 바꿔 더해주었다.
코드 구현
class Solution {
public int solution(String s) {
int answer = s.length();
//합칠 갯수는 1부터 전체 문자열 길이의 반까지 반복
for (int i = 1; i <= s.length() / 2; i++) {
int count = 1;
String preStr = "";
String nextStr = "";
String result = "";
for (int j = 0; j < s.length(); j++) {
nextStr += s.charAt(j);
//문자열이 맨 앞인 경우
if(preStr.equals("")){
if((j+1)%i==0){
preStr = nextStr;
nextStr = "";
}
continue;
}
//문자열이 맨 앞이 아닌 경우부터 이전 문자열과 비교
//i만큼 문자열을 다 묶었을 때
if((j+1)%i==0){
if(preStr.equals(nextStr)) {
//이전 문자열과 같으면 갯수 +1
count++;
} else {
//같지 않으면 최종 문자열에 (갯수+문자열) 끝에 붙인 후 갯수 초기화
if (count > 1) result += count;
result += preStr;
count = 1;
}
//문자열이 끝난 경우
if(j==s.length()-1){
if (count > 1) result += count;
result += nextStr;
}
//preStr 갱신
preStr = nextStr;
nextStr = "";
continue;
}
//묶고 문자가 남았다면 모두 결과 문자열 끝에 붙임
if(j==s.length()-1){
if (count > 1) result += count;
result += preStr;
result += nextStr;
}
}
if(result.length()<answer) {
answer = result.length();
}
}
return answer;
}
}