본문 바로가기
코딩테스트/프로그래머스 0단계 - 입문

프로그래머스 0단계 - Day3 사칙연산, 조건문, 배열

by 학습하는 청년 2024. 3. 13.

나머지 구하기

정수 num1, num2가 매개변수로 주어질 때, num1를 num2로 나눈 나머지를 return 하도록 solution 함수를 완성해주세요.

  • 0 < num1 ≤ 100
  • 0 < num2 ≤ 100
const solution = (num1, num2) => (num1 % num2);

쉬운 문제. 화살표 함수로 간결하게 작성하였다.


중앙값 구하기

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

  • array의 길이는 홀수입니다.
  • 0 < array의 길이 < 100
  • -1,000 < array의 원소 < 1,000
// 1.array 배열의 요소를 출력한다.
// 2.요소들의 값을 비교한다.
// 3.가장 작은 값을 새로운 배열에 넣는다.
// 4.정렬된 배열에서 가운데 값을 출력한다.

// 1.array 배열의 요소를 출력한다.
// 2.요소들의 값을 비교한다.
// 3.가장 작은 값을 새로운 배열에 넣는다.
// 4.정렬된 배열에서 가운데 값을 출력한다.

function solution(array) {
  let arrayCnt = 0;
  let newArray = [];
  while(arrayCnt < array.length) {
    // 배열에서 최솟값 찾기
    let minNumber = 1000;
    let cnt = 0;
    while(cnt < array.length) {
      if(minNumber > array[cnt]) minNumber = array[cnt];
      cnt = cnt + 1;
    }
    
    // minNumber <- 최소값
    newArray.push(minNumber);
    
    // 원래 배열에서 찾은 값은 지운다.
    let cnt2 = 0;
    while(cnt2 < array.length) {
      if(minNumber === array[cnt2]) {
        array[cnt2] = 1000;
        break;
      }
      cnt2 = cnt2 + 1;
    }
    arrayCnt = arrayCnt + 1;
  }
  return newArray[(Math.floor(array.length / 2))];
}

// 다른 사람의 풀이
function solution(array) {
  return array.sort((a, b)) => a - b)[Math.floor(array.length / 2)];
}

알고리즘의 순서까지는 생각해냈는데, 코드를 어떻게 적용해야 할지 몰랐다. "for.. of문을 사용하면 될 것 같은데..." 까지는 떠올렸다.

 

배열을 정렬하는 것이 쉬운 느낌이지만, 낯선 입장에서는 어려운 게 맞다는 말에 안도... 그렇지만 안주하지는 말자!

어려웠던 문제... 아직 잘 모르겠다. 종종 들여다보자!

 

<다른 사람의 풀이에 대한 이해>

sort() 함수를 사용하면 한 번에 끝나는 문제.

참 허탈하다. 그럼에도 for문으로 무식하게 하자. 이 방법이 옳다고 믿기 때문에.

 

1) sort() 메소드를 사용하여, 오름차순으로 정렬한다. // 원본 배열을 정렬한다.

2) 배열도 객체이므로, 대괄호 표기법을 활용하여 값에 접근한다.

3) Math.floor()를 사용했으므로, 수직선 상의 오른쪽 값을 갖는다. 즉, array[값]


최빈값 구하기

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

  • 0 < array의 길이 < 100
  • 0 ≤ array의 원소 < 1000
// 1.배열의 요소를 같은 숫자끼리 정렬시킨다.
// 2.정렬된 배열 ex) [a, a, a, b, b, c, c ...]의 요소의 첫 번째 요소와 다음 요소를 비교한다.
// 3.비교를 통해 값이 같으면 기록하고, 다를 경우 새로운 카운트를 시작한다.

function solution(array) {
    let sortedArray = array.sort((a, b) => a - b);
    let answer = 0;
    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 = repeatCnt + 1;
        }
        
        if(repeatCnt === choiRepeatCnt) {
            if(choi !== array[cnt]) {
                isDupChoi = true;   
            }
        }
        
        if(repeatCnt > choiRepeatCnt) {
            choi = array[cnt];
            choiRepeatCnt = repeatCnt;
            isDupChoi = false;
        }
        
        beforeNumber = array[cnt];
        cnt = cnt + 1;
    }
    if(isDupChoi) return -1;
    return choi;
}

// 다른 사람의 풀이
function solution(array) {
    let m = new Map();
    for (let n of array) m.set(n, (m.get(n) || 0)+1);
    m = [...m].sort((a,b)=>b[1]-a[1]);
    return m.length === 1 || m[0][1] > m[1][1] ? m[0][0] : -1;
}

function solution(array) {
    let obj = {}
    for(let i = 0 ; i < array.length ; i++){
        if(obj[array[i]]){
            obj[array[i]]++
        }
        else{
            obj[array[i]] = 1 
        }
    }
    let nums = []
    for(let key in obj){
        nums.push(obj[key])
    }
    let max = Math.max(...nums)
    let result = []
    for(let key in obj){
        if(obj[key] === max){
            result.push(Number(key))
        }
    }
    return (result.length === 1 ? result[0] : -1)
}

위의 문제(중앙값 구하기)와 마찬가지로 아이디어까지는 얼추 떠오르는데.. 어렵다.

잘 익혀두자.

 

<다른 사람의 풀이에 대한 이해>

해설을 달기에는 내 실력이 부족하다. 일단 keep!

깔끔해보여서 가져왔다.

 

객체를 활용하고, for...in 함수를 사용해서 신선했다.

Math.max()

 


짝수는 싫어요

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

  • 1 ≤ n ≤ 100
function solution(n) {
  let answer = [];
    
  let i = 1;
  while(i <= n) {
    if(i % 2 !== 0) {
      answer.push(i);
    }
    i++;
  }
  return answer;
}

// 다른 사람의 풀이
function solution(n) {
  let answer = [];
  for(let i = 1; i <= m; i += 2) {
    answer.push(i);
  }
}

function solution(n) {
  return Array(n).fill(1).map((v, i) => v + i).filter(v=> v % 2 === 1);
}

비교적 쉬웠던 문제. 새로운 배열을 만들고 반복문을 통해 얻어진 값을 push()를 사용하여 새로운 배열을 완성시킨다.

 

<다른 사람의 풀이에 대한 이해>

반복문의 step을 2로 증가시켜서 처음부터 짝수가 나오지 않게 만들 수 있다! 증감 표현도 자유자재로 다뤄보자!

 

메소드 체이닝을 해체해보자.

1) Array(n)을 통해 n개의 요소를 갖는 배열을 만든다.

2) fill(1)을 통해 배열의 요소들을 1로 채운다. // [1, 1, 1, 1, ...., 1]

3) map((v, i) => v + i)를 통해, 새로운 배열을 만든다.

--> [1 + 0, 1 + 1, 1 + 2, ...., 1 + n] 즉, 1부터 n까지를 요소로 갖는다.

4) filter(조건)을 통해, 배열의 요소를 변경한다. // filter()는 새로운 배열을 만들지 않고 원본 배열을 수정한다.


참고 영상

https://youtu.be/wnl3UyLecnc?si=in0ryZgjy_cImnRU

댓글