(1).백준 14002번 가장 긴 증가하는 부분 수열 4는 기존 수열처리와는 다르게 해당하는 배열도 출력해야 하는 문제였다.
처음에는 어제 예상한 방식대로 마지막 숫자가 변경될 경우에만 체크하고
그 외에는 배열 끝에 push하는 방식으로 처리했었지만 오답이 나와버렸고
원인을 파악해보니 a,b,c,d에서 b가 대체되었고 그 뒤에 d가 대체되었다면 c까지 바뀌지 않았기 때문에
현재 arr에 담긴 내용은 a,b2,c,d2인 상태에서 대체되어버리지만
실제로는 c가 바뀌지 않았기 때문에 a,b,c,d가 맞는 내용이라서 이 방식은 문제가 있었다.
결국 index를 통해 각각에 담기는 arr의 index를 기록하는 배열을 따로 생성해주고
beforeIndex를 통해서 이전에 바라보는 index를 조회해서 살짝 트리 느낌으로 해당 값 아래에 매달리게 진행했다.
이후로는 a, b, c, d, b2, d2 순서대로 들어온다고 하더라도
각각의 index는 [0,1,2,3,1,3]형태가 되어버리고
beforeIndex는[x,0,1,2,0,2]형태가 되기 때문에 마지막 대체된 d2를 기준으로 따라간다고 하더라도
d2가 바라보는 앞글자는 c가 되고 c가 바라보는 앞글자는 index1인 b가 되기 때문에
자연스럽게 a,b,c,d2 형태로 마무리가 될 수 있는 방식이 됐다.
이후 이 내용을 역순으로 한글자씩 추적해준 다음
shift로 넣어줄 경우 시간복잡도가 매 행동마다 O(N)이라 O(N^2)이 되기 때문에
모두 push로 넣은 값을 reverse로 정상 순서대로 바꿔준 다음 출력하는 방식으로 해결했다.
const input = `16
-60 -41 -100 8 -8 -52 -62 -61 -76 -52 -52 14 -11 -2 -54 46`.split('\n')[1].split(' ').map(Number)
const arr = []
const index = []
const beforeIndex = []
const result = []
for(let i = 0 ; i < input.length ; i++){
let low = 0
let high = arr.length
while(low < high){
let mid = Math.floor((low + high)/2)
if(arr[mid] < input[i]){
low = mid + 1
}
else{
high = mid
}
}
if(low < arr.length){
arr[low] = input[i]
}
else{
arr.push(input[i])
}
index.push(low)
if(low > 0){
beforeIndex[i] = index.lastIndexOf(low-1)
}
}
let now = index.lastIndexOf(arr.length-1)
while(now != undefined){
result.push(input[now])
now = beforeIndex[now]
}
console.log(arr.length)
console.log(result.reverse().join(' '))
'회고' 카테고리의 다른 글
[개발일지] - 470 (5) | 2024.10.15 |
---|---|
[개발일지] - 469 (0) | 2024.10.14 |
[개발일지] - 467(주말) (2) | 2024.10.12 |
[개발일지] - 466(연차) (0) | 2024.10.11 |
[개발일지] - 465(연차) (1) | 2024.10.10 |