
😎풀이
nums의 각 숫자 빈도 파악
- 이전 숫자로 끝나는 부분수열이 존재할 경우, 이전 부분수열에 덧붙임
- 현재 수 ~ 현재 수 + 2 까지의 수가 존재할 경우, 새로 부분 수열을 만듦
- 어느것도 포함되지 않을 경우 부분수열 생성 불가
- 부분수열의 생성 가능 여부 반환
function isPossible(nums: number[]): boolean {
const freqMap = new Map<number, number>()
for(const num of nums) {
freqMap.set(num, (freqMap.get(num) ?? 0) + 1)
}
const endMap = new Map<number, number>()
for(const num of nums) {
const numFreq = freqMap.get(num) ?? 0
if(numFreq <= 0) continue
const prevEndFreq = endMap.get(num - 1) ?? 0
const nextFreq = freqMap.get(num + 1) ?? 0
const doubleNextFreq = freqMap.get(num + 2) ?? 0
if(prevEndFreq >= 1) {
freqMap.set(num, numFreq - 1)
endMap.set(num - 1, prevEndFreq - 1)
endMap.set(num, (endMap.get(num) ?? 0) + 1)
} else if(nextFreq >= 1 && doubleNextFreq >= 1) {
freqMap.set(num, numFreq - 1)
freqMap.set(num + 1, nextFreq - 1)
freqMap.set(num + 2, doubleNextFreq - 1)
endMap.set(num + 2, (endMap.get(num + 2) ?? 0) + 1)
} else {
return false
}
}
return true
};