240615 배열, 수학 (2)

정수현·2024년 6월 15일

Programmers

목록 보기
3/4

2024.06.15
2024.06.17

🌞 Day 3

02 중앙값 구하기
03 최빈값 구하기
04 짝수는 싫어요


📍 중앙값 구하기

▶ 문제 설명

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

function solution(array) {
  var answer = 0;
  return answer;
}

◼ 제한사항
array의 길이는 홀수입니다.
▪ 0 > array의 길이 > 100
▪ -1,000 > array의 원소 > 1,000

▶ 코드 작성

🚩 배열 정렬하기

1) 배열에서 최소값 찾기

① 변수 선언
minNumber : 배열의 최소값 (초기엔 배열에 들어갈 수 없는 값으로 초기화한다. 최소값을 구해야하므로 가장 큰 값을 최소값에 넣는다.)

let minNumber = 1000;

(예시)

let minNumber = 1000;
if(minNumber > array[0]) {
  minNumber = array[0];
}
if(minNumber > array[1]) {
  minNumber = array[1];
}
if(minNumber > array[2]) {
  minNumber = array[2];
}

(적용하기)

let minNumber = 1000;
//true
if(1000 > 9) { 
  minNumber = 9;
}

//true
if(9 > -1) { 
  minNumber = -1;
}

//false
if(-1 > 0) { 
  minNumber = array[2];
}

minNumber == -1;

② 코드 간결하게 작성

let minNumber = 1000;
for(let i=0; i<array.length; i++) {
  if(minNumber > array[i]) {
    minNumber = array[i];
  }
}

2) 새 배열에 최소값 추가

① 새 배열 만들기

let newArray = [];

② 새 배열에 최소값 추가
▪ 배열에 값을 추가할 때는 push() 메소드를 사용한다.

let newArray = [];
newArray.push(minNumber);

3) 기존 배열에서 최소값 삭제

▪ 기존 배열에서 최소값에 해당하는 원소를 큰 숫자로 바꾼다.

for(let i=0; i<array.length; i++) {
  if(minNumber === array[i]) {
    array[i] = 1000;
  }
}

▪ 최소값을 삭제했으면 반복문을 즉시 끝낸다. break문을 사용한다.

for(let i=0; i<array.length; i++) {
  if(minNumber === array[i]) {
    array[i] = 1000;
    break;
  }
}

4) 배열의 길이만큼 반복하기

for(let i=0; i<array.length; i++) {
  //최소값 찾기
  let minNumber = 1000;
  for(let i=0; i<array.length; i++) {
    if(minNumber > array[i]) {
      minNumber = array[i];
    }
  }
  
  //새 배열에 최소값 추가
  let newArray = [];
  newArray.push(minNumber);
  
  //기존 배열에서 최소값 삭제
  for(let i=0; i<array.length; i++) {
    if(minNumber === array[i]) {
      array[i] = 1000;
      break;
    }
  }
}

🚩 중앙값 구하기

▪ 예를 들어 배열의 길이가 5이면 중앙값은 array[2]가 될 것이고, 배열의 길이가 3이면 중앙값은 array[1]가 될 것이다.

▪ 이것을 참고해봤을 때, 배열 array의 중앙값은 배열 길이를 2로 나눈 것의 몫에 해당한다.

▪ 몫 구하는 함수 : Math.floor(n/2)

return newArray[Math.floor(array.length/2)];

💻 전체 코드

function solution(array) {
  let minNumber = 1000;
  let newArray = [];
  
  //1. 정렬하기
  for(let i=0; i<arary.length; i++) {
    //1-1. 최소값 구하기
    for(let i=0; i<array.length; i++) {
      if(minNumber > array[i]) {
        minNumber = array[i];
      }
    }
  
    //1-2. 새 배열에 최소값 추가하기
    newArray.push(minNumber);
  
    //1-3. 기존 배열에서 최소값에 해당하는 원소 삭제
    for(let i=0; i<array.length; i++) {
      if(minNumber === array[i]) {
        array[i] = 1000;
        break;
      }
    }
  }
  //2. 중앙값 구하기
  return newArray[Math.floor(array.length/2)];

▶ 실행 결과

array result
[1, 2, 7, 10, 11] 7
[0, -1, 0] 0

📍 최빈값 구하기

▶ 문제 설명

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

function solution(array) }
  var answer = 0;
  return answer;
}

◼ 제한사항
▪ 0 > array의 길이 > 100
▪ 0 >= array의 원소 > 1000

▶ 코드 작성

▪ 배열 정리 메소드
let sortedArray = array.sort((a,b) => a-b);

🚩 원소 개수 세기?

① 앞에서부터 차례대로 원소 세는 반복문

let cnt = 0;
while (cnt < array.length) {
  cnt++;
}

array[cnt] : 배열의 원소에 접근

let cnt = 0;
while (cnt < array.length) {
  array[cnt];
  cnt++;
}

🚩 최빈값을 그때그때 기록한다.

1) 변수 선언

choi : 최빈값 (등장할 수 없는 수인 -1로 초기화한다.)
choiRepeatCnt : 최빈값이 될 때 몇 번 반복해서 된건지를 나타냄
repeatCnt : 현재 똑같은 숫자가 몇 번 등장했는지를 나타냄 (현재 choi-1로 들어온 적 없는 값이므로 0으로 초기화한다.)
beforeNumber : 지금 보고 있는 이전 숫자 (다른 숫자로 넘어갈 때를 나타내야 하므로 사용한다.)

let choi = -1;
let choiRepeatCnt = 0;
let repeatCnt =0;
let beforeNumber = -1;

2) 이전 숫자에서 다음 숫자로 넘어갈 때

if : 배열에서 다음 숫자로 넘어갈 때를 의미함
if(beforeNumber !== array[cnt])
→ 이때 choi-1에서 배열의 첫번째 요소로 넘어가므로 repeatCnt = 1;로 초기화한다.

else : 배열에서 다음 숫자로 넘어가지 않음을 의미함
repeatCnt1씩 증가한다.

let cnt = 0;
while (cnt < array.length) {
  if(beforeNumber !== array[cnt]) {
    repeatCnt = 1;
  } else {
    repeatCnt++;
  }
  array[cnt];
  cnt++;
}

3) 새로운 최빈값의 등장

최빈값이 바뀌는 순간 ,
choi는 배열의 현재 원소 즉, array[cnt]가 된다.
▪ 최빈값으로 바뀌게 된 카운트 숫자는(choiRepeatCnt) 현재 반복 횟수(repeatCnt)가 된다.

if(repeatCnt > choiRepeatCnt) {
  choi = array[cnt];
  choiRepeatCnt = repeatCnt;
}
beforeNumber = array[cnt];
cnt++;
return choi;

🚩 최빈값이 두 개 이상인 경우

1) 변수 선언

let isDupchoi = false;

2) 최빈값이 중복됐을 때 + 최빈값이 현재 원소와 다를 때

= 중복이라는 것을 마크한다.

if(repeatCnt === choiRepeatCnt) {
  if(choi !== array[cnt]) {
    isDupChoi = true;
  }
}

3) 최빈값이 다시 등장한다면, false로 값을 다시 바꿔준다.

if(repeatCnt > choiRepeatCnt) {
  choi = array[cnt];
  choiRepeatCnt = repeatCnt;
  isDupCHoi = false;
}

④ 최빈값이 여러 개일 땐 -1을 반환한다.

if(isDupChoi) return -1;

💻 전체 코드

function solution(array) {
  let sortedArray = array.sort((a,b) => a-b);

  let cnt = 0;
  let choi = -1;
  let choiRepeatCnt = 0;
  let repeatCnt = 0;
  let beforeNumber = -1;
  let isDupChoi = false;
  
  while(cnt < array.length) {
  
  if(beforeNumber !== array[cnt]) {
    repeatCnt = 1;
  } else {
    repeatCnt++;
  }
  
  if(beforeNumber === choiRepeatCnt) {
    if(choi !== array[cnt]) {
      isDupChoi = true;
    }
  }
  
  if(repeatCnt > choiRepeatCnt) {
    choi = array[cnt];
    choiRepeat = repeatCnt;
    isDupChoi = false;
  }
  
  beforeNumber = array[cnt];
  cnt++;
  }
  
  if(isDupChoi) return -1;
  return choi;
}

▶ 실행 결과

array resut
[1, 2, 3, 3, 4, 4] 3
[1, 1, 2, 2] -1
[1] 1

📍 짝수는 싫어요

▶ 문제 설명

정수 n이 매개변수로 주어질 때, n 이하의 홀수가 오름차순으로 담긴 배열을 return 하도록 solution 함수를 완성해주세요.

function solution(n) {
  var answer = [ ];
  return answer;
}

▶ 코드 작성

🚩 반복문 만들기
0부터 매개변수 n까지의 숫자를 차례로 비교해야 하므로 n만큼의 반복 횟수를 가진 반복문을 만든다.

for(let i=0; i<=n; i++) { 

}

🚩 조건문 만들기
▪ 홀수일 때의 값을 찾아야 하므로 조건문에 조건식 i % 2 !== 0을 넣는다.

for(let i=0; i<=n; i++) { 
  if(i % 2 !== 0) {
  
  }
}

🚩 조건식이 참일 때 요소 넣기
▪ 조건문이 참일 때 answer에 만족하는 수를 넣어야 하므로
배열의 마지막에 요소를 추가하는 메소드 push() 메소드를 활용한다.

for(let i=0; i<=n; i++) { 
  if(i % 2 !== 0) {
    answer.push(i);
  }
}

▶ 실행 결과


프로그래머스 문제 링크
02 중앙값 구하기
03 최빈값 구하기
04 짝수는 싫어요

0개의 댓글