1. 문제

sameFrequency라는 함수를 작성하세요. 두 개의 양의 정수가 주어졌을 때, 두 숫자의 자릿수가 같은 빈도를 갖는지 구합니다.

 

여러분의 솔루션은 반드시 다음과 같은 복잡성을 가져야 합니다.:

Time: O(N)

 

예시 인풋:

  1. sameFrequency(182, 281) //true
  2. sameFrequency(34, 14) //false
  3. sameFrequency(3589578, 5879385) //true
  4. sameFrequency(22, 222) //false
 

2. 내 해결책

const sameFrequency = (num1, num2) => {
    let num1_arr = num1.toString().split("");
    let num2_arr = num2.toString().split("");

    if(num1_arr.length !== num2_arr.length) return false;
    
    let num1_obj = {};
    let num2_obj = {};

    for(let i = 0; i < num1_arr.length; i++){
        num1_obj[num1_arr[i]] === 1 ? num1_obj[num1_arr[i]] += 1 : num1_obj[num1_arr[i]] = 1;
    }
    for(let i = 0; i < num2_arr.length; i++){
        num2_obj[num2_arr[i]] === 1 ? num2_obj[num2_arr[i]] += 1 : num2_obj[num2_arr[i]] = 1;
    }

    for(let i in num1_obj){
        if(num1_obj[i] !== num2_obj[i]){
            return false;
        } 
    }

    return true;
}

sameFrequency(3589578, 5879385)

 

3. 다른 해결책 

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;
}

 

4.  느낀점

1. 문자열은 .split("")을 쓰지 않아도 반복문을 쓸 수 있는데 사용해서 코드를 낭비했다. ( 2 ~ 3 )

2. 변수명을 _obj, _arr 붙이는 습관을 버리자

 - num1_obj => strNum1

 - num1_arr => countNum1

3. or 연산자를 이용해서 코드를 더 줄일수 있었다.

num2_obj[num2_arr[i]] === 1 ? num2_obj[num2_arr[i]] += 1 : num2_obj[num2_arr[i]] = 1;

 --------------------------------   
    
countNum1[strNum[i]] = (countNUm[strNum[i] || 0]) + 1;

4. 객체를 돌때는 for in 반복문을 사용하자.

for(let i in num_obj){
	if(num1_obj[i] !== num2_obj[i]){
    	return false;
    }
}

--------------------------------------------

for(let key in countNum1){
	if(countNum[key] ! countNum2[key]) return false;
}