배열이 주어지고 배열안에는 숫자들이 있다. 배열 각 원소들이 있는데 뒤의 원소에서 가까운 큰 숫자를 찾아서 변경하면 되는 문제이다.
예) [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을돌기 때문에 지금 큰값과 이전 작은 값들을 한번에 변경해줄수 있다.
쭉 훑어보고 이해하니 이해가 되었고 대단하였다.. 이코드를 가장 먼저 푼 사람은 정말 대단한 사람이다.
나는 이런 생각도 못하고 그냥 내장 함수중에 찾아서 문제를 풀 생각부터 하니 아직 글러먹었다. 내장 함수는 답이 아니고
도구로서 사용 해야 하는 것을.. 그래도 로직을 한번 쭉 이해하고 다시 문제를 푸니 로직을 풀때 궁금했던 것들도 이해가 되긴했다.
궁금했던 내용이 왜 인덱스로 스택에 저장을 할까 그냥 값으로 저장을 하면 보기 편할것 같은데? 라는 생각을 했는데.
직접 풀어보니 인덱스로 접근하는 것이 깔끔하기도 하고 값을 넣어서 비교를 해도 그 값의 자리를 다시 찾아줘야 하니 번거롭기 까지 하였다.
컴퓨팅적인 사고를 좀더 키워야 한다. 일단 내가 푼 풀이가 잘 작동되는지 궁금해서 제출 해봤는데 정답에 통과되고 말았다..
그래서 이렇게 작성해둔다. 다음에 다시 풀어야 한다!
오늘도 새로운 공부가 되었다.