728x90
문제 설명
제한 사항
문제 풀이 방법
- s의 길이가 1일때도 값을 반환해도 맞게 answer = s.length로 할당한다.
- s의 길이가 2이상인 경우는 최소 한번의 압축을 시도하기 때문에 첫번째 for문은 1부터 시작하며,
문자열을 압축하는 기준이 되는 문자열의 길이는 최대 s의 절반이다. - 첫번째 for문은 몇개의 문자로 압축할 것인지,
두번째 for문은 문자열을 순회하며 조건에 맞는 경우에 로직을 실행하기 위함이다. - 첫번째 for문에 압축하는 문자길이 별로 나오는 결과를 담는 빈 문자열 str,
해당 문자로 압축한 횟수를 담는 count,
문자열을 압축하는 기준이 되는 문자 standStr,
현제 문자의 인덱스를 저장하는 idx 각 변수를 선언해준다. - 두번째 for문은 for(let idx=i; idx<=s.length; idx+=i) 이렇게 작성이 되는데,
우선 idx = i 는 처음 기준이 되는 standStr 다음으로 오는 nextStr을 검색하기 위해 사용하며,
문자열 s를 전체적으로 순회해야 하기 때문에 s.length 까지 진행하며,
기준이 되는 문자의 길이만큼 압축을 하기에 idx += i 가 된다. - 1 조건 (첫번재 if문)
standStr과 nextStr이 같은 경우 : count에 1을 더한다.(같은 문자열 이기에 압축을 진행한다)
standStr과 nextStr이 다른 경우 : 이는 압축을 진행할 수 없기에 str에 압축한 횟수와 문자열을 작성해 줘야한다.- count가 1인 경우 : 문자열을 저장하는 str에 standStr을 더함
- count가 1이 아닌 경우 : count와 standStr을 더함
- 2 조건 (첫번재 if문)
이 조건문은 위의 2번째 for문에서 압축하는 문자열의 길이 즉 압축 길이로 나누면
나머지가 남는 경우에 남은 문자열을 str에 더하기 위함이다.
(총 문자열 길이 10, 나누려 하는 문자열 길이 3, 나머지 문자열 길이 1)
내가 작성한 코드
function solution(s) {
let answer = s.length;
for(let i=1; i<=s.length/2; i++){
let str = '';
let count = 1;
let standStr = s.substr(0, i);
let idx = 0;
for(let idx=i; idx<=s.length; idx+=i){
let nextStr = s.substr(idx, i);
if(standStr === nextStr){
count = count + 1;
}
else{
if(count === 1){
str = str + standStr;
}
else{
str = str + count + standStr;
}
standStr = nextStr;
count = 1;
}
}
if(count === 1){
str = str + standStr;
}
else{
str = str + count + standStr;
}
answer = Math.min(str.length, answer);
}
return answer
}
728x90
'코딩 테스트 > 프로그래머스 코딩 테스트 연습' 카테고리의 다른 글
1Level / 연습 문제 / 최대공약수와 최소공배수 (0) | 2023.05.23 |
---|---|
2Level / Summer/Winter Coding(~2018) / 점프와 순간 이동 (0) | 2023.05.22 |
2Level / 연습문제 / 숫자 블럭 (0) | 2023.05.18 |
2Level / 2018 KAKAO BLIND RECRUITMENT / [1차] 프렌즈4블록 (0) | 2023.05.15 |
1Level / 연습문제 / 제일 작은 수 제거하기 (0) | 2023.05.12 |