당분간은 패턴을 응용해서 문제를 연습을 할 것 같다. 오늘은 어제의 Frequency Counter을 이용해서 문제를 풀어보고 추가로 Multiple Pointers 패턴을 이용해서도 문제를 풀어볼 것이다. 그렇게 하는 것으로 둘의 차이를 비교할 수 있을것이고 어떤 상황에 어떤 패턴이 더 적절한지 파악할 수 있을것이라 기대한다.
Implement a function called, areThereDuplicates which accepts a variable number of arguments, and checks whether there are any duplicates among the arguments passed in. You can solve this using the frequency counter pattern OR the multiple pointers pattern.
Examples:
areThereDuplicates(1, 2, 3) // false areThereDuplicates(1, 2, 2) // true areThereDuplicates('a', 'b', 'c', 'a') // trueRestrictions:
Time - O(n)
Space - O(n)Bonus:
Time - O(n log n)
Space - O(1)
이 문제에서 areThereDuplicates는 파라미터의 숫자가 정해져 있지 않다. 때문에 어떤 파라미터가 들어오든 받아내는 가변인자함수로 구현해야한다. 가변인자함수를 구현하는 방법은 두 가지 있다. 하나는 함수 내부에서 arguments로 정의해 받아내는 것이고, 나머지 하나는 spread 연산자를 사용하는 것이다. 이곳에서의 풀이들은 모두 spread 연산자를 사용했다. 가변인자함수 구현에 대해서는 내일 더 자세히 이야기하고자 한다.
function areThereDuplicates(...args) {
// good luck. (supply any arguments you deem necessary.)
if(args === null || args.length < 0 ) return '계산불가';
//객체 생성
let lookup = {};
//객체 안에 존재하면 return true 존재하지 않으면 1을 세팅
for(let i = 0; i <args.length; i++){
if(lookup[args[i]]){
return true;
}else{
lookup[args[i]] = 1
}
}
return false;
}
function areThereDuplicates(...args) {
// good luck. (supply any arguments you deem necessary.)
let sortArr = args.sort();
var firstPoint = 0;
var secondPoint = 1;
for(let i = 0; secondPoint<sortArr.length; i++){
if(sortArr[firstPoint] === sortArr[secondPoint]){
return true;
}else{
firstPoint++;
secondPoint++
}
}
return false;
}