본문 바로가기

코딩테스트

[CodeWars] IQ Test

문제 설명 :

Bob is preparing to pass IQ test. The most frequent task in this test is to find out which one of the given numbers differs from the others. Bob observed that one number usually differs from the others  in evenness. Help Bob — to check his answers, he needs a program that among the given numbers finds one that is different in evenness, and return a position of this number.

 

* Keep in mind that your task is to help Bob solve a real IQ test, which means indexes of the elements start from 1 (not 0)

 

나의 풀이 : 

function iqTest(numbers){

    const numArray = numbers.split(" ").map(l => parseInt(l))
    let even = 0;
    let odd = 0;
    let result = 0;

    numArray.forEach((l) => {
        if(l % 2 === 1){
            odd++;
        }else{
            even++;
        }
    })

    if(odd === 1){
        result = numArray.findIndex((l) => {
            return l%2 === 1
        })
    }else{
        result = numArray.findIndex((l) => {
            return l%2 === 0
        })
    }
  
    return result + 1
}

먼저 문자열로 들어온 값을 공백을 기준으로 쪼개고, 그 쪼갠 값들을 parseInt를 통하여 숫자로 배열에 넣어주었다. 

 

그런다음 각각 홀수와 짝수의 갯수를 구했다. 

 

홀수든 짝수이든 갯수가 1개인 값이 홀로 엉뚱한 값이기 때문에 홀수든 짝수든 갯수가 1개인 녀석을 찾아서, 인덱스를 찾아내는 방식으로 했다. 

 

다른 사람들의 풀이도 있다. 

 

다른 사람들의 풀이

첫번째 : 

function iqTest(numbers){
	//여기까지는 나와 같다. 
    numbers = numbers.split(" ").map(function(el){return parseInt(el)});
    
    //나와의 차이점은 filter를 통해서 바로 값을 구했다는 것이다. 
    var odd = numbers.filter(function(el){ return el % 2 === 1});
    var even = numbers.filter(function(el){ return el % 2 === 0});
    
    //그리고 각각의 길이를 확인 후, 그 값의 인덱스를 리턴하도록 했다. 
    return odd.length < even.length ? (numbers.indexOf(odd[0]) + 1) : (numbers.indexOf(even[0]) + 1);
  }

 

두번째 풀이(이건 천재인가 싶었다..) :

function iqTest(numbers){
	//들어온 모든 배열을 2로 나눈 나머지값으로 저장한다. 
    var nums = numbers.split(" ").map(x => x % 2); 
    
    //모든 값을 더한다. 만약 홀수가 많은 경우 값이 1보다 클 것이고, 짝수가 많은 경우 1일 것이다. 
    var sum = nums.reduce((a,b) => a + b);  
    
    //target에 전체 합이 1보다 클 경우(홀수)는 0을 넣고, 1일 경우에는(짝수) 1을 넣는다. 
    var target = sum > 1 ? 0 : 1;
    
    //배열 내에서 1이든 0이든 해당하는 값의 인덱스를 가져온다. 
    return nums.indexOf(target) + 1;
  }