코테연습 -boostcamp

KIMMY·2020년 6월 25일
0

코딩테스트연습

목록 보기
4/7

문제: 자연수가 들어있는 배열 arr가 매개변수로 주어진다. 배열 arr안의 숫자 중에서 앞에 있는 숫자들부터 뒤에 중복되어 나타나는 숫자들 중복 횟수를 게산해서 배열로 return.
만약 중복이 없다면 배열에 -1 채워서 return.

링크: https://blog.naver.com/boostcamp_official/221978031932

나의 정답:

arr = [3,2,4,4,2,5,3];

arr.sort();
console.log(arr);  // [ 2, 2, 3, 3, 4, 4, 5 ]
let answer = [];
let count = 0;
for (let i=0; i < arr.length; i++){
    if(arr[i]===arr[i+1]){
      count = count + 1;
    }else if(arr[i] !==arr[i+1] && count){
      answer.push(count+1);
      count = 0;
    }
}
if(answer.length === 0){
  answer = [-1];
}
console.log(answer);   // [ 2, 2, 2 ]
  1. 중복되는 값을 나란히 놓기위해 sort 사용.
  2. for문을 통해 숫자들을 두개씩 비교.
    2-1. 중복 숫자가 있는 경우( if )
    -> count를 올린다.
    2-2. 중복 숫자들 이후에 다른 숫자 발견한 경우 (else if)
    (count가 true 이며 비교하는 두 수가 다를 때)
    -> 배열에 count+1을 넣는다.
    -> 카운트를 0으로 초기화.
  3. for 문 이후에 정답배열이 비어있으면 [-1] 을 채운다.

모범답안링크: https://blog.naver.com/boostcamp_official/222002632132

Set을 공부하고 다음 코테연습에서 활용해봐야겠다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Set


모범 답안에서 힌트를 얻고 다시 해보았다.

let arr = [3,2,1,1,1,1];

let setOfArray = new Set([]);
let answer = [];
function countNumber(number){
  let count = 0;
  arr.forEach( element => (number === element)
                          && (count += 1) 
              )
  count > 1 ? answer.push(count) : null 
}

function solution(arr){
  arr.forEach(number => setOfArray.has(number) 
                        ?  null 
                        :  (
                          setOfArray.add(number)
                          , countNumber(number)
                          )
              )
  return answer.length>0 ? answer : (answer.push(-1), answer) ;
  
}

let a = solution(arr);
console.log(a);

3항 연산자에서 return; 하고싶을때 null을 사용했는데 괜찮나 모르겠다!!! 결과는 같은데 문제가 없는걸까?


이전에는 set을 공부하고 활용하였고 이번에는 map 객체를 공부했다. 이를 이용해 또 답을 구했다.

let arr = [1,2,3,3];
let answer = [];
let myMap = new Map();

function count(number){
myMap.forEach((value,key) => (key === number) 
                         ? myMap.set(key,value+1)
                         : null
             )
}

function solution(arr){
 
 arr.forEach(number => myMap.has(number) ? count(number) 
                                         : myMap.set(number, 1)

             )
 myMap.forEach(value=> value>1 ? answer.push(value): null)
 return answer.length > 0 ? answer : (answer.push(-1), answer) 
}

let a = solution(arr);
console.log(a);

map에서 중요한 것은 .forEach(value,key) 이다.
무의식적으로 (key,value)를 넣어서 이상한 값이 나왔다..

  • 정말 멀었다. map을 활용하면 따로 count 함수를 쓸 필요가없다.
arr.forEach(number => myMap.has(number) ? myMap.set(number, myMap.get(number)+1) 
                                         : myMap.set(number, 1)

             )
profile
SO HUMAN

0개의 댓글