1. sameFrequency라는 함수를 만드십시오. 2개의 정수에서 서로 같은 빈도수와 숫자가 같은 확인하는 함수를 만드십시오. 해답에서는 시간 복잡도가 O(N)이어야 합니다.
<해답 결과 예시>
sameFrequency(182, 281) // true
sameFrequency(35989578, 5879385) // true
sameFrequency(288, 134) // false
해답
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 < strNum2.length; j++){
countNum2[strNum2[j]] = (countNum2[strNum2[j]] || 0) + 1;
}
for(let key in countNum1){
if(countNum1[key] !== countNum2[key]{
return false;
}
}
return true;
}
2. 두개의 배열을 받는 same이라는 함수를 만드시오. 첫 번째의 배열에 있는 요소들을 제곱을 했을때 해당하는 두 번째 배열의 요소들과 모두 일치하면 true로 반납하고 그것이 아니면 false로 반납해야 한다. 두 배열의 빈도 수는 동일해야 한다.
<해답 결과 예시>
same([1,2,3], [4,1,9]) // true
same([1,2,3], [1,9]) // false
same([1,2,1], [4,4,1]) // false (같은 빈도수여야 한다)
해답
function same(arr1, arr2){
if(arr1.length !== arr2.length){
return false;
}
let frequencyCounter1 = {};
let frequencyCounter2 = {};
for(let val of arr1){
frequencyCounter1[val] = (frequencyCounter1[val] || 0) + 1;
}
for(let val of arr2){
frequencyCounter2[val] = (frequencyCounter2[val] || 0) + 1;
}
for(let key in frequencyCounter1){
// frequncyCounter1에서 제곱을 했을때 frequencyCounter2에 key값이랑 일치하는지 확인
if(!(key**2 in frequencyCounter2)){
return false;
} // end of if statement
// freqeuncyCounter2에서 key의 value값(frequencyCounter1의 key임)이 frequencyCounter1의 key의 value값이
// 일치하는지 확인
if(frequencyCounter2[key**2] !== frequencyCounter1[key]){
return false
} // end of if statement
} // end of for statement frequencyCounter1
return true
}
same([1,2,3], [4,1,9])
'IT > Algorithm(알고리즘)' 카테고리의 다른 글
Multiple Pointers(여러개 포인터) - averagePair (0) | 2023.04.17 |
---|---|
재귀함수호출(Recursion) (0) | 2023.04.16 |
Frequency Counter2(숫자나 글자에서 반복되는 것 있는지 확인) (0) | 2023.04.10 |
Divide and Conquer (0) | 2023.04.08 |
Sliding Window (슬라이딩 윈도우) (0) | 2023.04.08 |