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

ch9eri·2022년 12월 23일
0
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개의 댓글