백준 풀이 🍪
백준 3273번 <두 수의 합>
섭웨이
2022. 9. 28. 16:37

백준 3273번 <두 수의 합>
실버 3
https://www.acmicpc.net/problem/3273
3273번: 두 수의 합
n개의 서로 다른 양의 정수 a1, a2, ..., an으로 이루어진 수열이 있다. ai의 값은 1보다 크거나 같고, 1000000보다 작거나 같은 자연수이다. 자연수 x가 주어졌을 때, ai + aj = x (1 ≤ i < j ≤ n)을 만족하는
www.acmicpc.net
한 동안 프로젝트에 전념하다가
오랜만에 알고리즘을 풀게 되었습니다.
이제 좀 알고리즘 별로 대비를 해볼까 해서 먼저 투포인터 알고리즘 관련 문제들을 풀어보았습니다.
const fs = require('fs');
const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
let n = parseInt(input[0]);
let arr = input[1].split(" ").map(Number).sort((a, b) => a - b);
let x = parseInt(input[2]);
let l = 0;
let r = n - 1;
let answer = 0;
while (l !== r) {
if (arr[l] + arr[r] == x) {
answer++;
r--;
} else if (arr[l] + arr[r] < x) {
l++;
} else if (arr[l] + arr[r] > x) {
r--;
}
}
console.log(answer);
for문을 두 번 돌아도 되지만
시간복잡도가 굉장히 커지면서 시간 초과가 나올 것 같더라구요.
일단 입력 받은 배열을 오름차순으로 정렬 하고 l (left) 변수를 맨 처음 인덱스 값(0)으로 초기화, r (right) 변수를마지막 인덱스 값(n-1)으로 초기화해주고 그 두 값을 더한 수와 x를 순차적으로 비교해줍니다.
그 둘을 더한 값이 x보다 크면 r값을 하나 빼주고, x보다 작으면 l값을 하나 더해주며, x와 같을 시에는
answer 값을 더해준 다음 r값을 빼줍니다.