일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- programmers
- lv2
- 너비 우선 탐색
- 백준
- 프로그래머스스쿨
- 구현
- 자료구조
- 자바스크립트
- 그리디 알고리즘
- 스택
- 프로그래머스
- 알고리즘
- 정렬
- 웹 프론트엔드
- 문자열
- 그래프이론
- level2
- 그래프 이론
- 다이나믹 프로그래밍
- CSS
- BASIC
- DFS
- DP
- 딕셔너리
- BFS
- 그래프 탐색
- JavaScript
- web
- 파이썬
- 브루트포스 알고리즘
Archives
- Today
- Total
DevLog:-)
[프로그래머스][Javascript]뒤에 있는 큰 수 찾기 본문
반응형
문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
map함수를 사용한 코드
function solution(numbers) {
var answer = [];
answer = numbers.map((e,i,arr)=> {
for(let j =i+1; j <arr.length;j++){
if(arr[j]>e){return arr[j];}
}
return -1;
})
return answer;
}
결과 : testcase 20~23을 시간 초과로 통과하지 못했다.
📖스택을 사용한 코드
function solution(numbers) {
var answer = new Array(numbers.length).fill(-1);
var stack = [];
for(var i =0;i<numbers.length;i++){
while(stack&&numbers[stack.at(-1)]<numbers[i]){
answer[stack.pop()] = numbers[i];
}
stack.push(i);
}
return answer;
}
결과 : 모든 testcase통과!
오랜 시도 끝에 시간 초과 문제를 해결하기 위해 찾아낸 코드는 위와 같았다.
스택을 이용한 코드인데 갑자기 이해 난이도가 극상이 된다.😭
이해를 위해 numbers가 [2,3,3,5]일 때 for문 안에 과정을 표로 만들어 보았다.
numbers = [2,3,3,5]
i | stack | answer |
초기 | [] | [-1,-1,-1,-1,] |
0 | [0] | [-1,-1,-1,-1] |
1 | [1] | [3,-1,-1,-1] |
2 | [1,2] | [3,-1,-1,-1] |
3 | [1] | [3,-1,5,-1] |
[] | [3,5,5,-1] | |
결과값 | [3] | [3,5,5,-1] |
✅checkpoint!
var arr = new Array(N).fill(-1); | 크기가 N이고-1로 채워진 배열 만들기 |
arr.at(-1) | 배열의 맨 뒤에 값 반환 |
💡아이디어 요약
map사용 | map함수를 이용했다. map에 인자로 들어가는 함수 내에 for문을 돌려 가장 가까운 큰값을 반환하게 하고 없을 경우 -1을 반환해서 answer이라는 새로운 배열을 만들었다. |
스택 사용 | 길이가 numbers와 동일하고 -1로 초기화된 answer배열을 만든다. 인덱스 값을 담을 stack배열을 만든다. stack배열에 인덱스를 넣고 후입선출 방식으로 stack안에 인덱스를 꺼내서 while문 안에 비교과정을 거쳐 해당 인덱스에 값을 넣는다. |
반응형