문제 해결 패턴에서 빈도 수 세기 패턴을 정리해보자! 사실 코드를 치며 각 주제마다 폴더를 만들어 README에 정리를 한 내용을 슬쩍슬쩍 옮겨오는 것이지만! 블로그에도 정리해두면 좋을 것 같아서 옮겨본다.
레츠꼬우~!_!
🐣 Question
2개의 배열을 허용하는 same이라는 함수를 작성. 배열의 모든 값이 두 번째 배열에 해당하는 값을 가지면 참을 반환. 따라서 첫 번째 배열에는 여러 값, 두 번째 배열의 값이 정확히 동일하지만 제곱되어 있음. 순서는 상관 없고, 제곱만 되어 있으면 됨. 값의 빈도도 동일해야 함.
🐤 example
입력 값
1,2,3
반환 값
4,1,9 // true
1,9,9 // false
🐤 solution 1
O(o^2)
function same(arr1, arr2) {
if (arr1.length !== arr2.length) {
return false;
}
for (let i = 0; i < arr1.length; i++) {
let correctIndex = arr2.indexOf(arr1[i] ** 2)
if (correctIndex === -1) {
return false;
}
console.log(arr2);
arr2.splice(correctIndex, 1)
}
return true;
}
same([1, 2, 3, 2], [9, 1, 4, 4])
설명
중첩된 루프 사용. 하나의 루프 작성하지만 그 자체가 루프인 인덱스 사용.
두 배열의 길이가 다른지 여부 확인
각 값의 제곱을 전달하는 위치에 indexOf를 호출(해당 배열에 루프 적용) indexOf
arr2에서 arr1의 각 값에 해당하는 인덱스를 물음 (ex [1,2,3], [9,1,4] 일경우, arr2에서 arr1의 값 1의 제곱이 어느 인덱스인지)
안내: 문자열에 소문자만 포함되어 있다고 가정해도 됩니다. Time Complexity - O(n)
function validAnagram(first, second) {
if (first.length !== second.length) {
return false;
}
const lookup = {};
for (let i = 0; i < first.length; i++) {
let letter = first[i];
lookup[letter] ? lookup[letter] += 1 : lookup[letter] = 1;
}
console.log(lookup)
for (let i = 0; i < second.length; i++) {
let letter = second[i];
if (!lookup[letter]) {
return false;
} else {
lookup[letter] -= 1;
}
}
return true;
}
// {a: 0, n: 0, g: 0, r: 0, m: 0,s:1}
validAnagram('anagrams', 'nagaramm')
설명
각 문자 길이 확인
첫번째 문자 for 반복 돌리면서 letter에 문자 차례로 넣어줌
lookup 배열에 letter key 있으면 +1 해주고, 아니면 1
다음 두번째 문자 for문 반복 letter에 문자 차례로 넣기
lookup에 두번째문자의 letter이 없으면 false
있으면 1빼기
입력값 validAnagram('anagrams', 'nagaramm')의 경우 s가 1개 남기 때문에 false임(5번에서 false 됨)
🤖 Quiz
문제1
빈도수 세기 - sameFrequency
sameFrequency라는 함수를 작성하세요. 두 개의 양의 정수가 주어졌을 때, 두 숫자의 자릿수가 같은 빈도를 갖는지 구합니다.
여러분의 솔루션은 반드시 다음과 같은 복잡성을 가져야 합니다.:
Time: O(N)
예시 인풋:
sameFrequency(182,281) // true
sameFrequency(34,14) // false
sameFrequency(3589578, 5879385) // true
sameFrequency(22,222) // false
정답1
풀은 것
function sameFrequency(a, b) {
const aa = a.toString();
const bb = b.toString();
if (aa.length !== bb.length) {
return false;
}
const match = {};
for (let i = 0; i < aa.length; i++) {
let letter = aa[i];
match[letter] = (match[letter] || 0) + 1
}
for (let i = 0; i < bb.length; i++) {
let letter = bb[i];
if (!match[letter]) {
return false;
} else {
match[letter] -= 1;
}
}
return true;
}
정답2
function sameFrequency(num1, num2) {
let strNum1 = num1.toString();
let strNum2 = num2.toString();
if (strNum1.length !== strNum2.length) return false;
let countNum1 = {};
let countNum2 = {};
for (let i = 0; i < strNum1.length; i++) {
countNum1[strNum1[i]] = (countNum1[strNum1[i]] || 0) + 1
}
for (let j = 0; j < strNum1.length; j++) {
countNum2[strNum2[j]] = (countNum2[strNum2[j]] || 0) + 1
}
for (let key in countNum1) {
if (countNum1[key] !== countNum2[key]) return false;
}
return true;
}