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
📌 작성한 코드
// 3273
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "Beakjoon/Silver/test.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
const N = parseInt(input.shift(), 10);
const numbers = input.shift().split(" ").map(Number);
const X = parseInt(input.shift(), 10);
const list = new Array(Math.max(...numbers) + 1).fill(false);
let answer = 0;
numbers.forEach((num) => {
if (!list[num]) list[num] = true;
if (list[X - num] && num !== X - num) answer++;
});
console.log(answer);
📌 풀이
배열을 순회하면서 각 숫자랑 더해서 X가 되는 숫자가 존재하는지 확인한다.
이렇게 풀게되면 한 번만 순회하고도 문제를 풀 수 있기 때문에 n의 시간복잡도로 문제를 해결할 수 있다.
현재 숫자와 x-현재 숫자가 같은 경우는 숫자는 한번밖에 나올 수 없기에 만들 수 없는 값이 되므로 해당 조건에는 카운트를 증가시키지 않는다.
numbers.forEach((num) => {
if (!list[num]) list[num] = true; // 현재 숫자가 존재함을 기록
if (list[X - num] && num !== X - num) answer++; // 더해서 x가 되는 숫자 확인
});
✅ 성공

'알고리즘 > 백준' 카테고리의 다른 글
| [JavaScript/연결리스트] 백준 실버 2 : 1406 - 에디터 (0) | 2024.01.20 |
|---|---|
| [JavaScript] 백준 실버 2 : 5397 - 키로거 (1) | 2024.01.20 |
| [JavaScript/BFS] 백준 골드 5 : 13549 - 숨바꼭질 3 (1) | 2024.01.18 |
| [JavaScript/BFS] 백준 골드 5 : 6593 - 상범 빌딩 (0) | 2024.01.16 |
| [JavaScript/DFS] 백준 실버 1 : 2583 - 영역 구하기 (0) | 2024.01.15 |