[ 문제 ]
이해하기 쉬운 문제이다. 알파벳을 한번씩만 사용하여 만든 단어(아이소그램)일 경우 true, 아니라면 false를 반환시키는 문제이다.
여기서 주의사항은, 빈 문자열을 입력받을 경우 true를 리턴,
그리고 대소문자는 구별하지 않는다.
[ 풀이 ]
나의 로직은 다음과 같다.
1/ 대소문자를 구별하지 않게 하기위해, 입력받은 문자열을 소문자 또는 대문자로 통일시킨다.
2/ 이중 반복문을 이용하여 똑같은 알파벳이 있으면 false를 반환시키고,
반복문이 끝나도록 같은 알파벳이 있지 않으면 true를 반환시킨다.
function isIsogram(str) {
let capital = str.toUpperCase(); //먼저 입력받은 str을 대문자로 통일시킨다.
for(let i = 0; i < capital.length-1; i++){ //이중 반복문을 이용하여 두개의 알파벳을 비교한다.
for(let j = i+1; j < capital.length; j++){
if(capital[i] === capital[j]){ //만약 동일한 알파벳이 있다면 false를 반환시킨다.
return false;
}
}
}
return true; //반복문이 종료되기 전까지 함수가 종료되지않으면(동일한 알파벳이 없다면) true를 반환시킨다.
}
[ 레퍼런스 ]
function isIsogram(str) { //moOse
if (str.length === 0) {
return true;
}
let cache = {}; //{m:true, o: true}
let strLowered = str.toLowerCase(); //moose
for (let i = 0; i < strLowered.length; i++) {
if (cache[strLowered[i]]) { //i === 2일때, cache['o']는 true값으로 이미 존재.
return false; //따라서 false값 반환
}
cache[strLowered[i]] = true;
}
return true;
}
처음 레퍼런스를 봤을때는, 왜이렇게 복잡하게 풀까? 라고 생각했는데 내가 착각한것이었다..
예전에 알고리즘에서 배웠던, Memoization을 이용한 것이었다.
**Memoization : 컴퓨터 프로그램이 동일한 계산을 반복해야 할 때, 이전에 계산한 값을 메모리에 저장함으로써 동일한 계산의 반복 수행을 제거하여 프로그램 실행 속도를 빠르게 하는 기술.
위 레퍼런스를 보면, 반복문을 한번만 실행하면서 그 값들을 객체에 넣어준다.
(내가 적은 풀이는 이중 반복문을 이용하여 시간복잡도가 높다.)
그리고 동일한 값이 cache라는 객체에 있다면 바로 false를 반환해준다.
'자료구조알고리즘 > 코드스테이츠 Coplit' 카테고리의 다른 글
18_numberSearch (0) | 2022.03.25 |
---|---|
15_modulo (0) | 2022.02.24 |
14_superIncreasing (0) | 2022.02.22 |
11_removeExtremes (0) | 2022.02.18 |
10_insertDash (0) | 2022.02.18 |