Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- Next.js 나이스 본인인증
- 다중포인터
- 프론트 본인인증
- 빈도수세기
- React 나이스 신원인증
- github
- JavaScript
- 사이트맵
- nextjs
- nextjs contact us
- web3-react
- swiper
- 메일 보내기 react
- CSS
- Til
- 알고리즘
- 카카오지도 구현
- robots.txt
- next.js kakaomap
- nextjs 메일보내기
- 전체 너비로 css
- pass인증
- 함수
- react
- 카카오맵 api
- 프로그래머스
- 구글 메일보내기
- 프론트엔드 질문
- react swiper
- next.js 지도 구현
Archives
- Today
- Total
YEV.log
알고리즘 문제 | 빈도수세기_anagram 본문
문제설명
2개의 문자를 인자로 받으며 두번째 문자열이 첫번째 문자열의 anagram인지 확인하는 validAnagram 함수이다.
(서로 가지고있는 문자의 개수가 똑같은지 확인)
예시
str1 | str2 | return |
aaz | zza | true |
awesome | awesom | false |
texttwisttime | timetwisttext | true |
🤔 문제 풀이 (before)
function validAnagram_before(str1, str2) {
let obj1 = {};
let obj2 = {};
//1. 길이 비교
if (str1.length !== str2.length) {
return false;
}
//2. str1, str2의 요소를 객체로 카운팅하기
for (let e of str1) {
if (obj1[e] === undefined) {
obj1[e] = 1;
} else {
obj1[e] += 1;
}
}
for (let e of str2) {
if (obj2[e] === undefined) {
obj2[e] = 1;
} else {
obj2[e] += 1;
}
}
// obj1 { t: 5, e: 2, x: 1, w: 1, i: 2, s: 1, m: 1 }
// obj2 { t: 5, e: 2, x: 1, w: 1, i: 2, s: 1, m: 1 }
//3. 객체의 값 비교
for (let e in obj1) {
if (obj1[e] !== obj2[e]) {
return false;
}
}
return true;
}
console.log('validAnagram',validAnagram('texttwisttime', 'timetwisttext')); //true
O(n)의 시간복잡도를 가지지만, 반복문을 총 3번 사용한다.
💡 문제 풀이
function validAnagram(str1, str2) {
//1. 길이 비교
if (str1.length !== str2.length) {
return false;
}
//2. str1의 요소를 객체로 카운팅하기
const lookup = {};
for (let i = 0; i < str1.length; i++) {
let letter = str1[i];
lookup[letter] ? (lookup[letter] += 1) : (lookup[letter] = 1);
}
// lookup { t: 5, e: 2, x: 1, w: 1, i: 2, s: 1, m: 1 }
//3. str2 의 요소를 객체에서 찾아 -1을 하고 값이 0이거나, 없다면 false를 반환.
for (let i = 0; i < str2.length; i++) {
let letter = str2[i];
if (!lookup[letter]) {
return false;
} else {
lookup[letter] -= 1;
}
}
return true;
}
console.log('validAnagram', validAnagram('texttwisttime', 'timetwisttext'));
해당 풀이는 O(n)의 시간복잡도이며,
하나의 문자열을 객체로 만들고, 그 객체의 값을 -로 빼면서 확인하는 방법을 사용하여 반복문을 총 2번 사용한다. (시간이 조금 더 짧다)
반응형
'Algorithm > 문제' 카테고리의 다른 글
알고리즘문제 | 다중포인터 패턴 (0) | 2023.05.14 |
---|---|
알고리즘문제 | 빈도수세기 (0) | 2023.05.03 |