백준/ Gold 2 문제 , 백준 Node.js 자바스크립트 2352 반도체 설계 [ LIS ]
✔️Check Point ! ( 해당사항 ✓체크 )
1. 막힘 없이 수월하게 풀린 문제인가?
2. 1시간이내로 풀렸던 문제인가?
3. 1시간 이상 or 며칠을 두고 풀어봤더니 풀린 문제인가?
4. 시간을 써도 도무지 풀 수 없는 문제인가?
5. 솔루션을 찾아봤는가?
-------------------------------------------------------------------------------------------
난이도 체감 🧑💻
1. 최상
2. 상
3. 중
4. 하
이해도 🙆♂️
1. 완벽히 이해
2. 다소 헷갈리는 부분들이 있음
3. 이해 못함
문제 출처 🏠
https://www.acmicpc.net/problem/2352
문제풀이 소감 🧑💻
LIS 문제이다. 가장 긴 증가하는 부분 수열 문제를 풀어봤다면 어렵지 않게 접근할 수 있을 것이다.
효과적으로 위치를 부여하기 위하여 이분탐색을 사용하였음.
문제를 처음 딱 봤을 때 어려워 보이지만 까보면 12738 가장 긴 증가하는 부분 수열 3 문제랑 똑같다. 쫄지말자.
해결 전략 📝
- 문제는 장황하지만 결국 말하고자 하는 것은 엇갈리지 않는 선을 찾아내는 것.
- 엇갈리지 않는다? => 증가하는 부분 수열을 찾으라는 것이다.
- 2565 전깃줄 문제와도 굉장히 유사함.
- 최대 연결 갯수를 찾으라 하였으므로 이 문제는 가장 긴 증가하는 부분 수열을 찾으라는 문제다.
두 가지로 나누어서 풀어주면 된다.
- LIS 끝 값에 담긴 값보다 크다면 LIS에 그냥 넣어준다.
- LIS 끝 값보다 작다면 내부로 들어와야 한다. => 이분탐색을 사용하여 어느 위치에 할당할 것인지 찾은 뒤 해당 인덱스에 숫자를 할당한다.
- 최종 LIS의 길이를 출력.
정답 💯
const input = require("fs")
.readFileSync("/dev/stdin")
.toString()
.trim()
.split("\n");
const [input_N, input_portnumbers] = input.map((v) => v.split(" ").map(Number));
function solution(N, portnumbers) {
const binarySearch = (target, left, right) => {
while (left < right) {
const mid = ~~((left + right) / 2);
if (LIS[mid] < target) left = mid + 1;
else right = mid;
}
return right;
};
const LIS = [];
portnumbers.forEach((portnumber) => {
if (LIS.length === 0 || LIS[LIS.length - 1] < portnumber)
LIS.push(portnumber);
else {
const changePlace = binarySearch(portnumber, 0, N - 1);
LIS[changePlace] = portnumber;
}
});
return LIS.length;
}
console.log(solution(input_N, input_portnumbers));
반응형