728x90
문제
https://www.acmicpc.net/problem/1253
코드
//골드4 좋다
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\r\n");
//투포인터
function twoPointer(arr, num) {
let start = 0; //배열의 시작 index
let end = arr.length - 1; //배열의 끝 index
//arr에서 서로다른 두 수를 더하는 것이니 두 수가 만나면안됨
while (start < end) {
let sum = arr[start] + arr[end]; //두 수의 합이
if (sum === num) return 1; //num과 같다면 바로 return 1을 하여 정답 +1
if (sum < num) start++;
//num보다 작다면 수를 늘려줘야 하기 때문에 start++
else end--; //아니면 수를 줄여줘야 하기 때문에 end--
}
return -1; //결국 num과 같지 않다면 return -1
}
let good = 0; //정답이 될 변수
//입력 배열들을 number화하여 오름차순 정렬
let numbers = input[1]
.split(" ")
.map((i) => parseInt(i))
.sort((a, b) => a - b);
for (let i = 0; i < numbers.length; i++) {
//배열의 각 요소에 대해
let num = numbers[i]; //한 요소씩 뽑아서
let newNumbers = numbers.slice(0, i).concat(numbers.slice(i + 1)); //기존 배열 numbers에서 뽑은 요소(num)을 기준으로 앞 뒤 배열을 잘라서 붙이기 => num만 없는 새로운 배열이 완성됨
if (twoPointer(newNumbers, num) === 1) good++;
else continue;
}
console.log(good);
후기
- 처음엔 이분탐색으로 푸는 문제인가 했지만 투포인터 알고리즘을 이용하여 푸는 문제였다
- 이분탐색은 start, middle, end 값을 이용하여 범위를 절반으로 줄여나가며 search하는 탐색으로 시간복잡도가 O(longN)이라는 특징이 있다
- 반면 투포인터탐색은 start, end값을 이용하여(두 개의 포인터를 찍는다는 의미로 투포인터이다) 조건에 따라 start++, end--를 통해 값을 줄여나가며 중간에서 만나게 되는 특징이 있다
- 상황에 따라 둘 중에 한 알고리즘을 쓰면 되고, 이 문제의 경우에는 투포인터를 써야하는 문제였지만 투포인터는 최악의 경우에는 시간복잡도가 O(N)이 걸린다는 단점이 있다
- 그리고 num이 없는 새로운 배열(newNumbers)을 만들어낼 때 filter도 사용해보고, splice도 사용해보았으나 둘 다 이 문제를 해결하기에는 구현이 잘 안됐다. filter를 적용하니 numbers에 같은 수가 여러 개 있을 때 적용이 안됐고, splice는 원본 배열을 바꿔주는 특징 때문에 적용이 안됐다. 그래서 원본 배열을 바꿔주지도 않으면서 배열을 자를 수 있는 slice 함수를 통해, num 수를 기준으로 배열을 잘랐고, 앞 뒤로 잘린 배열들은 concat() 함수로 붙여줬다
- 비록 이 문제를 푸는데 여러 실패와 시간초과도 겪었지만 이 문제를 통해 여러 문법들과 알고리즘에대해 깊게 알 수 있었다
'알고리즘 > BOJ' 카테고리의 다른 글
[백준] 체스판 다시 칠하기 / JavaScript / node.js (0) | 2022.02.06 |
---|---|
[백준] 문자열 분석 / JavaScript / node.js (0) | 2022.02.05 |
[백준] 숫자 카드 / JavaScript / node.js (0) | 2022.02.04 |
[백준] 차집합 / JavaScript / node.js (0) | 2022.02.03 |
[백준] 접미사 배열 / JavaScript / node.js (0) | 2022.02.03 |