프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
나의 풀이
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 |