[BOJ] 백준 2121 JS

Y_Y·2023년 9월 21일
0

Baekjoon

목록 보기
7/9

백준 / 2121 / JS / Map

https://www.acmicpc.net/problem/2121

문제

네 사람이서 2차원 평면상의 N개의 점을 이용해서 할 수 있는 놀이가 있다. 바로 각 사람이 1개씩의 점을 적절히 선택해서 변이 x축 혹은 y축에 평행한 직사각형을 만드는 일이다. 물론 그냥 만들면 재미가 없기 때문에 가로의 길이가 A 세로의 길이가 B인 직사각형을 몇 가지나 만들 수 있는지 알아보기로 했다.

예를 들어 점이 A(0, 0), B(2, 0), C(0, 3), D(2, 3), E(4, 0), F(4, 3)의 6개가 있고, 만들고 싶은 직사각형이 가로가 2, 세로가 3인 직사각형이라면 (A, B, C, D), (B, D, E, F)의 두 가지 경우가 가능하다. 모든 경우의 수를 구해보자.

입력

첫 줄에 점들의 개수 N(5 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에 만들고 싶은 직사각형의 가로 길이 A(1 ≤ A ≤ 1,000)와 세로 길이 B(1 ≤ B ≤ 1,000)가 주어진다. 다음 N줄에 걸쳐서 점들의 좌표가 정수로 주어진다. 이 값의 범위는 -1,000,000,000이상 1,000,000,000이하이다. N개 점들의 좌표는 각각 다르다.

출력

첫 줄에 가능한 모든 경우의 수를 출력한다. 경우의 수는 231-1보다 작거나 같다.

풀이

입력 값들이 다 양의 방향으로 증가하기 때문에 2차원 좌표로 봤을 때 1, 3, 4사분면의 좌표값은 확인할 필요가 없다. 따라서 가로, 새로 값을 입력 받은 좌표에 대입하여 해당 좌표가 있을 경우를 확인하여 모든 조건에 부합할 경우 answer의 값을 증가시켰다.

백틱을 사용해서 검색하기보다 [x, y]와 같은 배열로 Set에 저장하고 탐색하려고 하니 조건이 맞지 않았다. Map, Set에 대해서 더 공부해봐야겠다.

let input = require('fs')
  .readFileSync(__dirname + '/input.txt', { encoding: 'utf-8' })
  .split('\n');

const n = parseInt(input.shift());
const [row, col] = input.shift().split(' ').map(Number);
let points = new Map();
let answer = 0;
input.forEach((e) => {
  const [x, y] = e.split(' ').map(Number);
  points.set(`${x}, ${y}`, 1);
});

for (const item of input) {
  const [x, y] = item.split(' ').map(Number);
  if (!points.has(`${x + row}, ${y}`)) continue;
  if (!points.has(`${x}, ${y + col}`)) continue;
  if (!points.has(`${x + row}, ${y + col}`)) continue;
  answer++;
}

console.log(answer);
profile
남을 위해(나를 위해) 글을 쓰는 Velog

0개의 댓글