지난주에, 민식주식회사는 IIHF(International Ice Hockey Federation)로부터 긴급한 전화를 받았다.
IIHF는 같은 팀이 링크안에 너무 많으면 알람이 울리는 시스템을 설치해달라고 요청했다. 시스템은 다음과 같이 3개의 부분으로 이루어진다.
디지털카메라가 링크의 사진을 매 1초마다 찍는다.
디지털카메라가 찍은 사진에서 각 선수의 위치를 뽑아낸다.
하키 링크 안에 같은 팀 선수가 총 몇 명인지 계산한다.
하키 링크는 (X, Y)가 가장 왼쪽 아래 모서리인 W * H 크기의 직사각형과, 반지름이 H/2이면서 중심이 (X, Y+R), (X+W, Y+R)에 있는 두 개의 원으로 이루어져 있다. 아래 그림을 참고한다.
선수들의 위치가 주어질 때, 링크 안 또는 경계에 있는 선수가 총 몇 명인지 구하는 프로그램을 작성하시오.
첫째 줄에 수 W H X Y P가 주어진다. P는 선수의 수이다. W와 H는 100보다 작거나 같은 자연수이고, H는 짝수이다. X와 Y는 절댓값이 100보다 작거나 같은 정수이다. P는 최대 50인 자연수이다. 둘째 줄부터 P개의 줄에 각 선수들의 x좌표와 y좌표가 주어진다. 이 좌표는 절댓값이 300보다 작거나 같은 정수이다.
첫째 줄에 링크 안에 있는 선수의 수를 출력한다.
// let input = require('fs').readFileSync('/dev/stdin').toString().split('\n');
let input = [`20 10 5 0 3`,
`15 5`,
`1 5`,
`1 1`];
let [W, H, X, Y, P] = input[0].split(' ').map(n=>parseInt(n));
let r = H/2;
let cnt = 0;
for(let i=1; i<=P; i++){
let coordArr = input[i].split(' ');
let coordX = parseInt(coordArr[0]);
let coordY = parseInt(coordArr[1]);
let rX = X-coordX;
let rrX = X+W-coordX;
let rY = Y+r-coordY;
if(coordX>=X && coordX<=(X+W) && coordY>=Y && coordY<=(Y+H)){
cnt++
}else if(coordX<X && r>=Math.sqrt(rX*rX+rY*rY)){
cnt++
}else if(coordX>X+W && r>=Math.sqrt(rrX*rrX+rY*rY)){
cnt++
}
}
console.log(cnt);
1) 사각형 구간
2) 왼쪽 반원 구간
3) 오른쪽 반원 구간
으로 나누어서 풀었다
원에서 중심까지의 거리가 r로 일정하기 때문에 그것보다 작거나 같으면 범위내에 있으므로 cnt++하는 방법으로 풀이하였다