코딩 테스트 공부

프로그래머스 자바스크립트 코딩 기초 트레이닝 - 배열 만들기4

dev_in 2025. 12. 9. 15:29

 

문제

정수 배열 arr가 주어집니다. arr를 이용해 새로운 배열 stk를 만드려고 합니다.

변수 i를 만들어 초기값을 0으로 설정한 후 i가 arr의 길이보다 작으면 다음 작업을 반복합니다.

  • 만약 stk가 빈 배열이라면 arr[i]를 stk에 추가하고 i에 1을 더합니다.
  • stk에 원소가 있고, stk의 마지막 원소가 arr[i]보다 작으면 arr[i]를 stk의 뒤에 추가하고 i에 1을 더합니다.
  • stk에 원소가 있는데 stk의 마지막 원소가 arr[i]보다 크거나 같으면 stk의 마지막 원소를 stk에서 제거합니다.

위 작업을 마친 후 만들어진 stk를 return 하는 solution 함수를 완성해 주세요.

고민한 점

새로운 배열 stk을 어떻게 선언해 줄지, 어떻게 반복 작업을 해줄 지 고민했습니다.

for문을 통해 루프를 돌고 if문을 통해 조건에 따른 작업을 해주려고 했습니다.

해결 과정

처음 작성한 코드는 이렇습니다.

function solution(arr) { 
const stk = [] 
const lastElement = stk.length -1 
for (let i =0; i < arr.length;) { 
	if (stk === []) { 
    	stk.push(arr[i]); i += 1; 
        } elseif (stk !== [] ) && stk[lastElement] < arr[i] {
        stk.push(arr[i]); i += 1; 
        } elseif (stk !== [] ) && stk[lastElement] >= arr[i] { stk.pop(lastElement) 
       } 
      } return stk; 
      }

 

하지만 해당 코드에는 여러 문제점이 있었습니다.

 

첫 번째로, stk가 빈 배열일 경우를 조건으로 한 if 문에서 조건문 stk ===[]이 잘못 되었습니다.

 

  • 자바스크립트에서 배열끼리의 비교는 “내용”이 아니라 “참조(주소)”를 비교합니다.
  • stk는 const stk = []로 한 번 만들었고, 그 이후에 []라는 "새 배열 리터럴"은 다른 객체입니다.
  • 그래서 stk === [] 는 항상 false 입니다.

배열이 비어있는지 확인하기 위해서는  stk.length === 0 이라는 조건문을 거는 것이 적절합니다.

 

두 번째로, 자바스크립트에서는 else if 라고 적어줘야 하고 조건 전체는 괄호 하나로 묶어야 합니다.

else if (stk.length !== 0 && stk[lastIndex] < arr[i]) {}

 

세 번째로, stk를 처음에 빈 배열로 뒀기 때문에 lastElement는 0 -1로 항상 -1이 됩니다.

 

마지막으로, pop() 메서드는 인자를 받지 않고 그냥 마지막 요소를 제거하는 메서드입니다.

 

수정 코드

function solution(arr) {
    const stk = []
    for (let i =0; i < arr.length;) {
        const lastIndex = stk.length -1;
        if (stk.length === 0) {
            stk.push(arr[i]);
            i += 1;
        } else if (stk[lastIndex] < arr[i]) {
            stk.push(arr[i]);
            i += 1;
        } else {
            stk.pop();
        }
    }
    return stk;

 

최종 결과 및 느낀 점

익숙하다고 생각한 메서드나 세부 문법도 헷갈려하는 경우가 있다는 것을 깨달았습니다. 좀 더 문법에 대해 익숙해질 필요가 있음을 깨달았습니다.

배열 끼리 비교시 내용이 아닌 참조(주소)를 비교한다는 것을 깨달았습니다.