KimMinJun
Coding Note
KimMinJun
전체 방문자
오늘
어제
  • 분류 전체보기 (486)
    • ALGORITHM (11)
      • 정렬 (6)
      • 최단경로 (1)
      • 자료구조 (1)
      • 슬라이딩 윈도우 (1)
      • etc (2)
    • Git (5)
    • Web (24)
      • Vanilla JS (13)
      • TS (2)
      • React (7)
      • ETC (1)
    • React 공식문서 (번역, 공부) (11)
      • Quick Start (2)
      • Installation (0)
      • Describing the UI (9)
      • Adding Interactivity (0)
      • Managing State (0)
      • Escape Hatches (0)
    • Next.js 공식문서 (번역, 공부) (3)
      • Getting Started (2)
      • Building Your Application (1)
    • PS (431)
      • 백준 (187)
      • Programmers (104)
      • CodeUp (21)
      • STL (3)
      • 제코베 JS 100제 (50)
      • SWEA (0)
      • LeetCode (65)
    • IT (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 관리

공지사항

인기 글

태그

  • Level1
  • Level 2
  • LeetCode
  • 그래프
  • js
  • 제코베 JS 100제
  • 다이나믹 프로그래밍
  • tree
  • recursion
  • codeup
  • Level 1
  • programmers
  • Level 0
  • C++
  • C
  • 문자열
  • 정렬
  • string
  • 수학
  • 백준

최근 댓글

최근 글

hELLO · Designed By 정상우.
KimMinJun
PS/백준

백준 / 기하학 / 1358번 / 하키 / JS

백준 / 기하학 / 1358번 / 하키 / JS
PS/백준

백준 / 기하학 / 1358번 / 하키 / JS

2022. 7. 5. 16:19

문제

지난주에, 민식주식회사는 IIHF(International Ice Hockey Federation)로부터 긴급한 전화를 받았다.

IIHF는 같은 팀이 링크안에 너무 많으면 알람이 울리는 시스템을 설치해달라고 요청했다. 시스템은 다음과 같이 3개의 부분으로 이루어진다.

  1. 디지털카메라가 링크의 사진을 매 1초마다 찍는다.
  2. 디지털카메라가 찍은 사진에서 각 선수의 위치를 뽑아낸다.
  3. 하키 링크 안에 같은 팀 선수가 총 몇 명인지 계산한다.

하키 링크는 (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보다 작거나 같은 정수이다.

출력

첫째 줄에 링크 안에 있는 선수의 수를 출력한다.

예제 입력 1 

20 10 5 0 3
15 5
1 5
1 1

예제 출력 1 

2

 

/* 하키 */const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : '../input.txt';
// const filePath = process.platform === 'linux' ? '/dev/stdin' : 'BOJ/input.txt';
const input = fs.readFileSync(filePath).toString().trim().split('\n');

// W: width, H: height, (X, Y), P: 선수의 수
const [W, H, X, Y, P] = input.shift().split(' ').map(Number);
const coordinate = [];

input.map(el => {
  coordinate.push(el.split(' ').map(Number));
});

function isIn(X, Y, x, y, r) {
  return (x-X)**2 + (y-Y)**2 <= r**2;
}

function solution(W, H, X, Y, P, coordinate) {
  let cnt = 0;

  for(const [x, y] of coordinate) {
    // 가운데 사각형 안에 있을 때,
    if((X <= x && x <= X+W) && (Y <= y && y <= Y+H)) cnt++;
    // 왼쪽 반원 안에 있을 때,
    else if(isIn(X, Y + H/2, x, y, H/2)) cnt++;
    // 오른쪽 반원 안에 있을 때,
    else if(isIn(X+W, Y + H/2, x, y, H/2)) cnt++;
  }

  console.log(cnt);
}

solution(W, H, X, Y, P, coordinate);

원의 방정식만 알고 있다면 쉬운 문제이다.

좌표가 범위 안에 들어가는지 계산할 때 경계에 있는것도 들어간 것으로 판단하므로 등호를 붙여주는 것만
조심하면 어렵지 않게 풀이 할 수 있다.

 

JS에는 거듭제곱을 나타내는 방법이 다른 언어에서 보통 사용되는 방식과 같이 pow를 사용하면 된다.

Math.pow(x, 2)는 x에 2제곱이라는 뜻이다.

하지만 JS에는 거듭제곱을 나타내는 연산자가 존재한다.

밑**지수 = 밑^지수 와 같은 의미이다.

저작자표시 (새창열림)

'PS > 백준' 카테고리의 다른 글

백준 / 그리디 / 1543번 / 문서 검색 / JS  (0) 2022.07.13
백준 / 기하학 / 1004번 / 어린 왕자 / JS  (0) 2022.07.06
백준 / Recursion(재귀) / 17478번 / 재귀함수가 뭔가요? / JS  (0) 2022.07.04
백준 / 그래프 - BFS / 2644번 / 촌수계산 / JS  (0) 2022.07.03
    'PS/백준' 카테고리의 다른 글
    • 백준 / 그리디 / 1543번 / 문서 검색 / JS
    • 백준 / 기하학 / 1004번 / 어린 왕자 / JS
    • 백준 / Recursion(재귀) / 17478번 / 재귀함수가 뭔가요? / JS
    • 백준 / 그래프 - BFS / 2644번 / 촌수계산 / JS
    KimMinJun
    KimMinJun

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.