📙 1. 문제
Link : https://school.programmers.co.kr/learn/courses/30/lessons/60057
문제 설명
풀이 1 : 실패(테스트 케이스는 통과 but 채점에서 다수 실패)
function solution(s) {
var answer = Infinity;
const howManyDup = (i,unit,cnt) => {
if(s.substring(i,i+unit)===s.substring(i+unit,i+unit+unit)){ // 뒤와 동일하다면
return howManyDup(i+unit,unit,cnt+1);
}else{
return cnt;
}
}
const getCount = (s,unit) => {
const arr = [];
let str = "";
for(let i=0;i<s.length;){
if(i>s.length-unit){
str+=(s[i])
i++;
continue;
}
let dupNum = howManyDup(i,unit,1);
if(dupNum===1) {
if(i===0) return s.length
str+=(s[i])
i++;
}else {
str+=(dupNum+s.substring(i,i+unit));
i+=(dupNum*unit)
}
}
return str.length
}
for(let unit=1;unit<=s.length/2;unit++){
let count = getCount(s,unit);
answer = Math.min(count,answer);
}
return answer;
}
- unit 변수(몇 개씩 자를 것이냐)를 1부터 최대 s의 길이/2까지 탐색하였다. 그 이상의 길이에서는 반복이 불가능하기 때문이다.
- 현재 index를 기준으로 unit만큼의 문자열과 뒤의 unit만큼의 문자열이 다르다면 (howManyDup값===1) 문자 하나만 arr에 삽입하고, index를 하나만 +한다.
- 동일하다면 arr에 반복 횟수(dupNum) + 반복 문자열을 arr에 삽입한다.
- 위 2,3번을 i 즉 index가 s.length-1이 될 때까지 반복한다. i가 s.length-unit보다 크다면, 즉 더 이상 반복할 수 없는 index라면 arr에 문자를 하나씩 push 하고, 다른 메서드는 실행하지 않는다.
- unit 즉, 몇 개씩 자를 것이냐를 for문을 돌리고 나머지는 함수화를 시켰다.
- getCount(s,unit) : 압축을 한 문자의 길이를 구하는 함수. 압축했을 때 문자열의 길이 return 한다.
- howManyDup(i, unit, cnt) : 뒤에 몇 번 반복하는지 구하는 함수. 반복하는 것이 없다면 1 그대로 return 하고 있다면 재귀함수를 이용해 cnt를 누적해 더해간다.
다른 사람 풀이
출처 : https://wonyoung2257.tistory.com/26
function solution(s) {
let answer = s.length;
for (let i = 1; i <= parseInt(s.length / 2); i++) {
let str = "";
let cnt = 1;
let tempStr = s.substr(0, i);
let idx = 0;
for (idx = i; idx <= s.length; idx += i) {
let nextStr = s.substr(idx, i);
if (tempStr === nextStr) {
cnt += 1;
} else {
if (cnt === 1) str = str + tempStr;
else str = str + cnt + tempStr;
cnt = 1;
tempStr = nextStr;
}
}
if (cnt === 1) str = str + tempStr;
else str = str + cnt + tempStr;
answer = Math.min(answer, str.length);
}
return answer;
}
- i(자르는 크기) = 1부터 s.length/2까지 반복하였다.
- 그 안에서 idx=i부터 s.length까지 i씩 더하며 반복 횟수(cnt)를 구한다.
- 반복이 끝나면 기존 값과 값을 비교해 최솟값을 구한다.
내가 문제를 잘못 이해했나. 내 풀이와 유사한 풀이인데, 내 풀이는 틀렸다고 나오고, 이 풀이는 맞다고 나온다.
🤔 2. 느낀 점
혼자 힘으로 완전히 해결하지는 못하였지만, 설계를 하고, 함수화를 통해 구간을 나눠가며 구현한 것에 대해 매우 만족한다. 함수형 프로그래밍의 '순수함수' 특징도 지키며 함수를 만드려 노력했다. 되도록 외부에서 넘긴 인자를 이용하여 함수를 구현하였고, 값이 변하지 않는 불변성을 유지하였고, 같은 값에는 같은 값을 반환하도록 하였다.
학교 가기 전에 2시간 가까이 붙잡고 있었지만 풀리지 않아 찜찜한 채로 학교에 다녀왔다. 다녀와서 처음부터 다시 풀어보니 20분 만에 풀렸다. 적어도 테스트 케이스는 통과하였다. 이렇게 기분을 Refresh 하고 새로운 마음가짐으로 푸는 것이 중요하다는 것을 또 느꼈다. 시간에 쫓겨 촉박한 마음을 가지고 풀면 그 무엇도 할 수 없다고 생각했다. 항상 마음의 여유를 가지고 살도록 하자.
🤩 3. 한 번 더 짚고 갈 점
앞으로도 함수형 프로그래밍의 특징을 곱씹으면서 코드를 작성하도록 하자. 함수형 프로그래밍의 장점으로는 side effect가 없고, 디버깅이 쉽고, 테스트하기 쉽고, 유지 보수성이 좋다는 장점이 있다. 이번 문제를 풀면서 순수함수로 함수를 만드니 이러한 장점들을 몸소 느낄 수 있었다.
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 표현 가능한 이진트리 (1) | 2023.05.19 |
---|---|
[프로그래머스] 거리두기 확인하기 (0) | 2023.05.14 |
[프로그래머스] 방금 그곡 (1) | 2023.05.13 |
[프로그래머스] 후보키 (0) | 2023.05.12 |
[프로그래머스] 순위 검색 (0) | 2023.05.07 |
[프로그래머스] 양궁대회 (1) | 2023.04.30 |
[프로그래머스] 게임 맵 최단거리 (0) | 2023.04.29 |
[프로그래머스] 이모티콘 할인행사 (0) | 2023.04.28 |