▲retry) 프로그래머스 js 뒤에있는 큰 수 찾기

이명진·2023년 4월 25일
0

코드카타

목록 보기
66/69

문제 요약

배열이 주어지고 배열안에는 숫자들이 있다. 배열 각 원소들이 있는데 뒤의 원소에서 가까운 큰 숫자를 찾아서 변경하면 되는 문제이다.
예) [2,3,3,5] =.> [3.5.5.-1]

없으면 -1을 넣어준다.

무조건 맨뒤는 -1이다.

나는 못풀었다. 나중에 다시 한번 풀어볼 것이다.

내가 푼 풀이

처음에는 쉽게 풀릴것 같아서 만만하게 봐서 문제를 풀었다
아래는 내가 푼 풀이다.

function solution(numbers) {
    var answer = [];
    let copy = numbers.slice(0);
    while(copy.length!==0){
      let tar = copy.shift();
      if(copy.length==0){
        answer.push(-1);
        break;
      }
     let isBig = copy.find(x=>x>tar);

      if(isBig){
        answer.push(isBig)
      }else{
        answer.push(-1)
      }
   
      
    }
  
    return answer;
}

그냥 find로 큰수를 찾아서 있으면 그 값을 넣어주고 없으면 -1을 넣어주도록 작성했다.

하긴 이렇게 간단히 풀리면 level2 는 아니다.

테케는 다 맞췄는데 제출하고 보니 시간 초과이다.
꼭 쉬운 문제들은 시간초과 문제들이 있는것 같다,

이리 저래 풀어보고 생각 해봤는데도 도저히 풀리지 않아서 정답을 찾아보게 되었다.

사람들이 푼 정답 풀이


function solution(numbers) {
    const answer = new Array(numbers.length).fill(-1);
  let stack = [];
    for(let i=0; i<numbers.length; i++){
      let tar = numbers[i];
      while(stack.length && numbers[stack[stack.length-1]]<tar){
        answer[stack.pop()] = tar
      }
      stack.push(i)
    }
    
    return answer;
}

물론 코드를 복붙 하지 않았다. 코드를 쭉 살펴보고 이해한다음에 내가 다시 작성한 코드이다 .
코드 길이도 그렇고 간단하게 풀었다.

처음 이 코드를 봤을때 ‘???’ 생각이 들었다. 이해가 한번에 가지 않아서 여러번 훑어보았다.

더많은 케이스를 볼겸 찾아봤지만 다 이런식으로 문제를 풀었다. 다 복붙한건지 아니면 다 생각이 똑같은건지..
나만 이렇게 어려운건지.. 일단 코드를 훑어 보았다.

일단 맨 마지막 값은 -1 이다 그래서 answr를 다시 배열로 만들어줬는데 -1로 채워준다.
for문도 딱 마지막 직전까지 돌아서 -1은 그대로 마지막에 리턴 될것이다.

그리고 스택을 넣었다. 나도 스택을 생각하긴 했는데.. 스택으로 푼 문제가 있는데 잘못해서 지워져버렸다.

스택값에 무조건 i값을 넣어준다. 이러면 i를 돌때마다 스택에는 이전 i값이 채워져 있다.

그리고 while문을바탕으로 스택에 값이 있고 스택에서 가져온 값과 현재 i값의 number값을 가져와서 비교한후
클 경우 answer[스택값] 을 큰 값으로 변경해준다.

stack값은 지금 i값의 이전 인덱스를 가지고 있고 while을돌기 때문에 지금 큰값과 이전 작은 값들을 한번에 변경해줄수 있다.

쭉 훑어보고 이해하니 이해가 되었고 대단하였다.. 이코드를 가장 먼저 푼 사람은 정말 대단한 사람이다.

나는 이런 생각도 못하고 그냥 내장 함수중에 찾아서 문제를 풀 생각부터 하니 아직 글러먹었다. 내장 함수는 답이 아니고
도구로서 사용 해야 하는 것을.. 그래도 로직을 한번 쭉 이해하고 다시 문제를 푸니 로직을 풀때 궁금했던 것들도 이해가 되긴했다.

궁금했던 내용이 왜 인덱스로 스택에 저장을 할까 그냥 값으로 저장을 하면 보기 편할것 같은데? 라는 생각을 했는데.

직접 풀어보니 인덱스로 접근하는 것이 깔끔하기도 하고 값을 넣어서 비교를 해도 그 값의 자리를 다시 찾아줘야 하니 번거롭기 까지 하였다.

컴퓨팅적인 사고를 좀더 키워야 한다. 일단 내가 푼 풀이가 잘 작동되는지 궁금해서 제출 해봤는데 정답에 통과되고 말았다..

그래서 이렇게 작성해둔다. 다음에 다시 풀어야 한다!

오늘도 새로운 공부가 되었다.

profile
프론트엔드 개발자 초보에서 고수까지!

0개의 댓글