자바스크립트 코딩테스트 정리

프로그래머스 js level 0 중앙값 구하기 - 메소드 사용하지않은버전

우주전사버즈 2023. 7. 10. 17:26

 

위 영상의 내용을 요약 및 참조하여 공부하였음.

YouTube 라매개발자


- 메서드를 사용해서 코드를 간결하고 간단하게 구현할수있지만 이는 알고리즘 공부의 효율성을 떨어트리고

코딩실력을 느려지게한다.

 

- 때문에 귀찮더라도 문제를 붙들고 직접 세세한 부분들을 구현해보는 것이 일이다. 이쁘고 간결한 코드는 없다. 구현이 목적이다. 

 

1. 문제 분석

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

 

문제의 목적: 1. 주어진 array배열의 숫자들을 정렬시킨다 2.중앙값을 return한다.

1번 방법 연구

1-1 : 배열의 처음부터 끝까지 돌아보면서 가장 작은 숫자부터 찾는다.

1-2 : 그렇게 찾은 가장 작은 값을 새로운 배열에 넣는다.

1-3 : 기존의 배열에서 찾은 값은 지운다.

1-4: 1-1 반복 

 

1-1 : 배열에서 최소값찾기

ex ) 임시의 입력값 [9 , -1 , 0] 을 넣은 상태를 생각해본다.

// 첫번째 인덱스값을 임시 최소값(9)으로 지정해둔뒤 다음 인덱스값들과 비교하면서 다음인덱스가  더 작은 숫자라면  최소값을 갱신시킬것.

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

코딩을 한뒤 스스로를 컴퓨터라고생각하면서 위에서부터 한줄씩 아래로 수행결과를 생각해보면서 읽어보기

 

위 코드의 문제점 : 배열의 길이가 100개라고생각해보자. 하나하나 다비교하기위해 코드가 엄청 길어질것이다.

 

해결책 -> 숫자만 계속 바뀌고 반복된 조건문연산이 실행되고있음 -> 반복문을이용하자!(기본중의기본임)

 

let minNumber = 1000;
    let cnt = 0;
    while(cnt < array.length){
  	    if(minNumber > array[cnt]) {
    	    minNumber = array[cnt];
        }
    cnt += 1;
}

배열의길이만큼 반복문을 돌면서 최소값을 갱신할것 

 

1-2 : 최소값 새 배열에 넣기

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

1-3 : 기존배열에서 최소값 지우기

let cnt2 = 0;
    while(cnt2 < array.length){
        if(minNumber === array[cnt2]){
            array[cnt] = 999;
            break;
            cnt2++;
        }
    }

지우는 메소드를 사용하는대신 기존배열에서찾은 최소값의 크기를 키워놓았다.

1-4: 원래배열길이만큼 반복했으면 끝냄 or 1-1로 반복

let arrayCnt = 0;
while(arrayCnt < array.length){
	최소값찾고 새배열에넣고 기존배열에서는 삭제하는 코드들 위에있는코드 이곳에넣기
	arrayCnt = arrayCnt + 1;
    }

 

 

2-1 가운데 값 꺼내기

인자로 들어가는 array 배열의 길이가 5일경우에는 중앙값은 array[2]에 있다. ex1) array = [1,2,7,10,11] 배열의 길이는 5  중간값은 array[2] = 7

ex2) array = [-1, 0 ,9]  배열의길이는 3 중간값은 array[1] = 0

ex3) array = [-8,1,6,8,10,63,142] 배열의길이는 7 중간값은 array[3] = 8   

 

이들의 공통점을보면 배열의길이 / 2 = 배열중앙값의 인덱스값

 

array[Math.floor(n/2)]

 

코딩 테스트 Tip

문제를 마주치면 문제를 해결할 절차적 순서 즉 알고리즘을 먼저 텍스트 , 이미지로 상상구현한 다음에  직접 구현한다.

 

위의 문제는 sort()함수를 이용해서 단 한 줄 만에 풀수있는 문제였다.

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

그러나 이보다는 직접 복잡하더라도 하나하나 문제를 아이디어화 시켜서 알고리즘을 직접 구현해내는 능력을 키우는 것이 정직한 성장의 길이다

 

 

완성된 코드

function solution(array) {
    var answer = 0;
    var newArray = [];
    let arrayCnt = 0;
    
    // 원래배열길이만큼 반복문돌면서 안에 로직 반복실행
    while(arrayCnt < array.length) {
         let minNumber = 1000;
        // 배열에서 최소값 찾기.
    let cnt = 0;
    while(cnt < array.length){
  	    if(minNumber > array[cnt]) {
    	    minNumber = array[cnt];
        }
    cnt += 1;
}
        // 새배열에 최소값넣기
    newArray.push(minNumber);
    
        // 기존배열에서 최소값 삭제하기 -> 최대값으로바꿔버리기
    let cnt2 = 0;
    while (cnt2 < array.length){
        if(array[cnt2] === minNumber){
            array[cnt2] = 999;
            break;
        }
        
        cnt2 += 1; 
    }
        
        arrayCnt += 1;
    }
    
   // 가운데 값을 꺼내기
    return newArray[Math.floor(newArray.length / 2)];
}