프로그래머스 LEVEL 2(뒤에 있는 큰 수 찾기)
-
사용 언어 : javascript
-
해결 날짜 : 2023-04-20
-
해결 방법 :
- dp와 2중 반복문을 활용해 문제 해결
- 외부 반복문에서 numbers를 거꾸로 돌되, numbers의 (마지막 인덱스 - 1)부터 시작(i)
- 내부 반복문에서 i 이후로 탐색(j)
- 현재보다 큰 값이면(numbers[j]) dp 업데이트 후 내부 반복문 종료
- dp가 현재보다 큰 값이면(dp[j]) dp 업데이트 후 내부 반복문 종료
- 이 때 dp가 -1이면(dp[j]) 뒤 숫자들은 더 이상 탐색할 필요가 없으므로 내부 반복문 종료
- dp와 2중 반복문을 활용해 문제 해결
-
회고 :
- 처음에 numbers의 길이가 1,000,000 이었기에 한 번 반복이나 이진탐색으로 해결해야 한다고 생각했다.
- 그러나 뒤 숫자들은 앞 숫자에 영향을 받기에 dp를 통해 해결할 수 있다고 생각했고, 코드를 짰다.
-
처음 코드
function solution(numbers) { const dp = Array.from({ length: numbers.length }, () => -1); for (let i = numbers.length - 2; i >= 0; i--) { for (let j = i + 1; j < numbers.length; j++) { if (numbers[i] < numbers[j]) { dp[i] = numbers[j]; break; } if (numbers[i] < dp[j]) { dp[i] = dp[j]; break; } } } return dp; }
-
그러나 두 테스트 케이스에서 시간 초과가 발생했다..
-
곰곰이 생각하던 중 안쪽 반복문에서 첫 dp[j]가 -1인 경우도 더 이상 뒤를 탐색할 필요가 없으므로 다음과 같이 조건에 추가했다.
if (numbers[i] < dp[j] || dp[j] === -1) { dp[i] = dp[j]; break; }
-
통과 !!
-
코드
function solution(numbers) { const dp = Array.from({ length: numbers.length }, () => -1); for (let i = numbers.length - 2; i >= 0; i--) { for (let j = i + 1; j < numbers.length; j++) { if (numbers[i] < numbers[j]) { dp[i] = numbers[j]; break; } if (numbers[i] < dp[j] || dp[j] === -1) { dp[i] = dp[j]; break; } } } return dp; }
-
출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges