백준/ Gold 2 문제 , 백준 Node.js 자바스크립트 3745 오름세 [ 이분탐색, LIS ]
✔️Check Point ! ( 해당사항 ✓체크 )
1. 막힘 없이 수월하게 풀린 문제인가?
2. 1시간이내로 풀렸던 문제인가?
3. 1시간 이상 or 며칠을 두고 풀어봤더니 풀린 문제인가?
4. 시간을 써도 도무지 풀 수 없는 문제인가?
5. 솔루션을 찾아봤는가?
-------------------------------------------------------------------------------------------
난이도 체감 🧑💻
1. 최상
2. 상
3. 중
4. 하
이해도 🙆♂️
1. 완벽히 이해
2. 다소 헷갈리는 부분들이 있음
3. 이해 못함
문제 출처 🏠
https://www.acmicpc.net/problem/3745
문제풀이 소감 🧑💻
공백처리를 잘못해서 몇번 틀렸다.
공백부분이 나오면 넘어가는 식으로 했었는데 이렇게는 해결이 안되어서 정규표현식을 사용하는 방법으로 바꿨다.
요구사항 📋
- 여러번의 TC가 주어짐.
- 따로 종료를 알리는 입력은 주어지지 않는다.
- 각 TC의 첫째 줄에는 관찰한 날(N ≤ 100000)이 주어진다
- 둘째 줄에는 관찰한 날의 주가들이 주어진다.
- 한 개 이상의 공백으로 구분된다.
주의 ❗
- 한 개 이상의 공백으로 구분된다.
이 조건이 중요.
정규표현식을 사용하면 간편하게 해결되지만, 다르게 해결하려면 조금 신경을 쓰게 되는 부분이였다.
5
1 2 3 4 5
위와 같은 입력이 들어온다는 것.
해결 전략 📝
우선 종료 문구가 따로 입력되지 않기 때문에 TC를 모두 입력 받아둔다.
이때, 한 개 이상의 공백으로 구분되므로 단순히 split(' ') 로는 해결할 수 없고
const input_TC = input.map((v) => v.trim().split(/\s+/g).map(Number));
위와 같은 정규표현식을 사용하여 공백을 제거한 뒤 배열을 만들어주었다.
이후 입력의 길이만큼 for 문을 돌려 홀수, 짝수 인덱스를 나눠서 해결하면 된다.
짝수 인덱스에는 N이 주어지닌 N만 입력받고 홀수 인덱스일 때는 N과 입력된 숫자들을 확인하여 결과를 출력한다.
각 TC해결법은 단순 LIS 길이를 구하기만 해주면 된다.
- LIS라는 빈 배열을 만들어준다.
- 주어진 숫자들을 앞에서부터 하나씩 탐색한다.
- LIS가 비어 있거나 LIS끝 값이 현재 숫자보다 작다면 LIS에 현재 숫자를 추가해준다.
- 만약 LIS 끝 값이 현재 숫자보다 크다면 LIS 내부로 숫자를 넣어줘야한다.
- 어느 위치에 넣어야하는지 인덱스를 알아야 하기 때문에 이분 탐색을 실행해준다.
- 나온 위치에 현재 숫자를 대입한다.
- 최종적으로 만들어진 LIS 길이를 출력한다.
정답 💯
const input = require("fs")
.readFileSync("/dev/stdin")
.toString()
.trim()
.split("\n");
const input_TC = input.map((v) => v.trim().split(/\s+/g).map(Number));
function solution(TC) {
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 check = (N, nums) => {
nums.forEach((num) => {
if (LIS.length === 0 || LIS[LIS.length - 1] < num) LIS.push(num);
else {
const changePlace = binarySearch(num, 0, LIS.length);
LIS[changePlace] = num;
}
});
return LIS.length;
};
let N = 0;
let LIS = [];
for (let i = 0; i < TC.length; i++) {
if (i % 2 === 0) N = TC[i];
else {
console.log(check(N, TC[i]));
LIS = [];
}
}
}
solution(input_TC);
반응형
'알고리즘 공부 > 백준 - 자바스크립트' 카테고리의 다른 글
백준/ Gold 2 문제 , 백준 Node.js 자바스크립트 1818 책정리 [ 이분탐색, LIS ] (0) | 2022.12.11 |
---|---|
백준/ Gold 3 문제 , 백준 Node.js 자바스크립트 2550 전구 [ 이분탐색, LIS ] (0) | 2022.12.11 |
백준/ Silver 2 문제 , 백준 Node.js 자바스크립트 18353 병사 배치하기 [ LIS ] (0) | 2022.12.10 |
백준/ Gold 2 문제 , 백준 Node.js 자바스크립트 1365 꼬인 전깃줄 (0) | 2022.12.10 |
백준/ Platinum 5 문제 , 백준 Node.js 자바스크립트 14003 가장 긴 증가하는 부분 수열 5 [ 이분탐색, LIS ] (0) | 2022.12.10 |