IT/Algorithm & CodeKata
[code kata] week 1 - day 3
nomoremystery
2023. 1. 18. 22:52
반응형
문제
String 형인 str 인자에서 중복되지 않은 알파벳으로 이루어진 제일 긴 단어의 길이를 반환해주세요.
str: 텍스트
return: 중복되지 않은 알파벳 길이 (숫자 반환)
예를 들어,
str = "abcabcabc"
return 은 3
=> 'abc' 가 제일 길기 때문
str = "aaaaa"
return 은 1
=> 'a' 가 제일 길기 때문
str = "sttrg"
return 은 3
=> 'trg' 가 제일 길기 때문
모범 풀이
const getLengthOfStr = (str) => {
let topLength = 0;
let arr = [];
for (i = 0; i < str.length; i++) {
if (arr.indexOf(str[i]) == -1) {
arr.push(str[i]);
} else {
arr = arr.slice(arr.indexOf(str[i]) + 1);
arr.push(str[i]);
}
if (topLength < arr.length) {
topLength = arr.length;
}
}
return topLength;
};
이 코드의 핵심은 str의 길이만큼 for문을 돌려서 중복되지 않은 알파벳은 추가하고 중복되는 알파벳은 이미 추가된 것을 먼저 지우고 나중 것을 추가하는 아이디어를 낼 수 있는가이다.
이번 문제에서는 문제를 제대로 푸는 것도 중요하지만 그 전에 문제를 제대로 이해하는 것이 우선시 되어야 한다는 점을 다시 한 번 상기시켜주었다.
실패한 나의 풀이
const getLengthOfStr = (str) => {
const arr = str.split('');
let star = [];
for (i = 1; i <= arr.length; i++) {
star.push(0);
}
for (let i = 0; i < arr.length - 1; i++) {
if (arr[i] === arr[i + 1]) {
star[i + 1] = 1;
}
}
const a = star.join('');
const b = a.split('1');
const c = [];
for (let i = 0; i < b.length; i++) {
c.push(b[i].length);
}
const d = c.sort();
const e = d[d.length - 1];
return e;
};
내 풀이의 문제점
- 변수를 선언할 때 이름을 쉽게 지어줘야 하는데, 변수를 너무 많이 생성하다 보니까 변수 이름 적절하게 짓는것도 쉽지 않아서 a, b, c, d, e 이런 식으로 변수를 지었다. 물론 조금이라도 더 의미 있게 지으려면 지을 수는 있지만 우선은 날 것 그대로의 코드를 가지고 왔다.
- 문제를 제대로 이해하지 못해서 abcabcabc와 같은 인풋에 대한 결과값이 출력되지 않았다. 힘들게 작성했지만, 문제를 제대로 이해하지 못한 내 탓이다.
.indexOf
메소드를 안쓰고 해보려고 했지만, 실패했다. 좋은 메소드가 있으면 적극 활용할 줄도 알아야 한다.- 기본적으로 문제도 해결하지 못하는 풀이기 때문에 갈 길이 먼 풀이다.
중복되지 않은 알파벳이라는 표현이 모호해서 문제 풀이 방향을 잘못 잡았던 점은 좀 아쉬웠다. 내가 이해력이 부족한 탓이지만..!
반응형