[Day2] 프로그래머스 JS 코테 연습 - 배열

ch9eri·2022년 12월 23일
post-thumbnail

2022/12/23

✏️ 오늘 푼 문제

  1. (Lv. 0) 나머지 구하기
  2. (Lv. 0) 중앙값 구하기
  3. (Lv. 0) 최빈값 구하기 ✨
  4. (Lv. 0) 짝수는 싫어요

📟 중앙값 구하기

문제 설명

중앙값은 어떤 주어진 값들을 크기의 순서대로 정렬했을 때 가장 중앙에 위치하는 값을 의미합니다. 예를 들어 1, 2, 7, 10, 11의 중앙값은 7입니다. 정수 배열 array가 매개변수로 주어질 때, 중앙값을 return 하도록 solution 함수를 완성해보세요.

✨ sort 해도 원래 배열이 바뀌지 않는다 ... (파이썬과 헷갈리지 말자 ...)
-> 새로운 배열 선언 or ...

✨ array.sort((a,b) => a-b); // 오름차순
✨ array.sort((a,b) => b-a); // 내림차순

답

function solution(array) {
    array.sort((a,b) => a-b);
    return array[parseInt(array.length/2)];
}

📟 최빈값 구하기

문제 설명

최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다.

✨ 배열 관련 메소드의 중요성 ... (안 쓰면 노가다)

✨ forEach : 주어진 함수를 배열 요소 각각에 대해 실행

const array1 = ['a', 'b', 'c'];
array1.forEach(element => console.log(element));
// expected output: "a"
// expected output: "b"
// expected output: "c"

✨ ...(Spread Operation)

let array = [1, 2, 3, 3, 3, 4];
console.log(...array) // 출력: 1 2 3 3 3 4
console.log(Math.max(...array)) // 출력: 4

✨ Set : 객체로 변환 -> 중복 제거시 사용❗️

const arr = [1, 2, 3, 4, 5, 2]
const set = new Set(arr)
console.log(set); // 출력: {1,2,3,4,5}

✨ Map : 키가 있는 데이터를 저장한다는 점에서 객체와 유사
➕ 키에 다양한 자료형을 허용

  • new Map() : 맵 만들기
  • map.set(key, value) : key를 이용해 value를 저장
  • map.get(key) : key에 해당하는 값을 반환. key가 존재하지 않으면 undefined를 반환.
  • map.has(key) – key가 존재하면 true, 존재하지 않으면 false를 반환.
  • map.delete(key) – key에 해당하는 값을 삭제
  • map.clear() – 맵 안의 모든 요소를 제거
  • map.size – 요소의 개수를 반환
let map = new Map();
map.set('1', 'str1');   // 문자형 키
map.set(1, 'num1');     // 숫자형 키
map.set(true, 'bool1'); // 불린형 키
// 객체: 키를 문자형으로 변환
// 맵: 키의 타입을 변환시키지 않고 그대로 유지
console.log( map.get(1)   ); // 'num1'
console.log( map.get('1') ); // 'str1'
console.log( map.size ); // 3

✨ Array.from() : 유사 배열 객체를 배열로 바꾸는데 사용

console.log(Array.from('foo'));
// 출력: Array ["f", "o", "o"]
console.log(Array.from([1, 2, 3], x => x + x));
// 출력: Array [2, 4, 6]

➕) 새로운 배열 생성할 때도 사용

const arr = Array.from({length: 5}, () => 0);
console.log(arr); // Array(5) [0, 0, 0, 0, 0]

✨ Array.indexOf() : 배열에서 지정된 요소를 찾을 수 있는 첫 번째 인덱스를 반환하고, 존재하지 않으면 -1을 반환

const beasts = ['ant', 'bison', 'camel', 'duck', 'bison'];
console.log(beasts.indexOf('bison')); // 출력: 1
console.log(beasts.indexOf('bison', 2)); //인덱스 2에서 시작 (출력: 4)
console.log(beasts.indexOf('giraffe')); // 출력: -1

답1 (배열 메서드 사용 ❌)

function solution(array) {
    array.sort((a,b) => a-b); //정렬
    var count = 0; //중복 횟수
    var modCnt = 0; //최빈값 중복 횟수
    var before = -1; //이전 값
    var mod = -1; //최빈값
    var isDup = false; //최빈값 중복 여부
    
    for(let i=0; i<array.length; i++) {
        if(before !== array[i]) //이전 숫자와 다르면
            count = 1; //count 1
        else //이전 숫자와 같으면
            count += 1; //count 증가
     
        //현재 반복 횟수와 최빈값 반복 횟수가 같을 때
        if(count === modCnt) { 
            if(mod !== array[i]) //최빈값과 현재값이 다르면
                isDup = true; //최빈값 중복
        }
        
        //현재 반복 횟수가 최빈값 반복 횟수보다 크면
        if(count>modCnt) { 
            modCnt = count; //최빈값 반복 횟수 업데이트
            mod = array[i]; //최빈값을 현재 값으로 업데이트
            isDup = false; //최빈값 하나
        }
        before = array[i]; //이전 값 업데이트
    }  
    if(isDup) //최빈값이 여러개면
        return -1;
    return mod;    
}

답2 (배열 메서드 사용 ⭕️)

function solution(array) {
    let map = new Map();
    
    // Map 객체 초기화
    for(let i = 0; i <= Math.max(...array); i++){
        map.set(i, 0);    
    }
    console.log(map)
    
    
    // array 배열의 원소값과 일치하는 Map 객체의 key를 증가시킨다
    for(let i = 0; i < array.length; i++){
        map.set(array[i], map.get(array[i]) + 1);
    }
    
    console.log(map)
    
    // Map 객체의 value만 모아서 배열로 만든다
    let arr = Array.from(map.values());
    
    // 최대값 산출
    let max = Math.max(...arr);
    
    // 최대값이 하나만 있다면 max, 여러 개 중복된다면 -1 출력
    if(arr.indexOf(max) !== arr.lastIndexOf(max)){
        return -1;
    } else {
        return arr.indexOf(max);
    }
}

🍒 생각

배열 메서드를 익히는 것도 중요하지만 기본적인 사고도 중요하다

profile
잘하자!

0개의 댓글