나의 풀이
2단계 문제를 처음으로 풀어보는데 slice()를 이용하여 문자열을 잘라서 붙여주는데까진 구현했으나,
이후로 비교를 어떤식으로 해야할지 모르겠어서 코드 실행자체를 해보지 못했다.
다른 사람의 풀이를 보고 문제를 이해해야겠다.
베스트 풀이
function solution(s) {
if(s.length === 1 ) return 1;
let min = 1000;
for (let i = 1; i <= s.length / 2; i++) {
let str1 = '';
let str2 = '';
let ans = '';
let count = 1;
for (let j = 0; j < s.length; j += i) {
if( j === 0 ) {
str1 = s.slice(j, j + i);
}else{
str2 = s.slice(j, j + i)
if(str1 === str2){
count++;
if(j+i === s.length) ans += `${count}${str1}`;
}else{
if( count > 1 ){
ans += `${count}${str1}`
}else{
ans += str1;
}
count = 1;
if(str1.length > str2.length){
ans += str2;
}
str1 = str2;
if(j+i === s.length) ans += str2;
}
}
}
min = Math.min(ans.length, min);
}
return min;
}
많은 풀이가 있었는데 이해하기가 조금 어려워서 그나마 이해한 풀이를 가지고 왔다.
for (let i = 1; i <= s.length / 2; i++) {
우선, 첫번째 for문의 s.length를 / 2한 것은 전체 길이의 반까지 갔을 때도 반복되는 문자열이 없다면,
압축해봤자 가장 짧은 값이 나오지 않기 때문이라고 이해했다.
let str1 = '';
let str2 = '';
let ans = '';
let count = 1;
변수를 네개로 나눈 이유는
- str1 : s.slice[0, ~] 로 첫번째 인덱스부터의 문자열을 저장하기 위함
- str2 : 두번째 for문 안에서 str1에 넣어둔 문자열과 비교하기 위함
- ans : 최종으로 나온 문자열을 저장하기 위함
- count : 1을 넣어둔 이유는 1개 이상 단위로 문자열을 잘라 압축해서 표현하기 위함
으로 보여진다.
이후로는 두번째 for문에서 값을 비교하고, count를 1로 계속 초기화해주면서 반복하다 문자열 s의 길이와 반복문에 사용된 j+i가 같아지면 ans에 문자열을 넣어서 문자열의 길이의 값을 비교한 후, 가장 짧은 문자열의 수를 return 해주는 함수인거 같다.
처음 다른 사람의 식을 봤을때 이해하기도 어려웠던거 같은데, 계속 보다보니까 이렇게 접근을 하면 풀 수 있구나라는걸 깨달게 되는거 같다. 알고리즘은 여러 문제를 꾸준하게 풀어보는 것이 중요한거같다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 소수 만들기 (0) | 2022.07.28 |
---|---|
[프로그래머스] 오픈채팅방 (0) | 2022.07.28 |
[프로그래머스] 숫자 문자열과 영단어 (0) | 2022.07.21 |
[프로그래머스] 로또의 최고 순위와 최저 순위 (0) | 2022.07.20 |
[프로그래머스] K번째 수 (0) | 2022.04.25 |