백준 1002번 터렛-JS

yugyeongKim·2021년 10월 27일
0

백준

목록 보기
25/52
post-custom-banner

수학은 공식 짜낼라지 말고 걍 공식 보고 알고리즘으로 옮기자

안되서 구글링 했는데 규칙 내가 엉성하게 짰음. 당연함. 내가 뭔 고등학생도 아니고 원어쩌구 공식? 기억안남.

- 어째저째 제출 한 코드

와 진짜 틀드탈트 붕괴오는줄 틀렸습니다 틀렸습니다 틀렸습니다 틀렸습니다 적당히 해 백준 상처주지말라고ㅜㅜ

const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
let input = fs.readFileSync(filePath).toString().trim().split('\n');
let answer = '';
let T = Number(input.shift());

for(let i=0; i < T; i++) {
    let arr = input[i].split(' ').map(x=>+x);
    // console.log(arr);
    let x1, x2, y1, y2, r1, r2;
    if(arr[2] > arr[5]) {
        r1 = arr[5];
        r2 = arr[2];
        x1 = arr[3];
        x2 = arr[0];
        y1 = arr[4];
        y2 = arr[1];
    } else {
        r1 = arr[2];
        r2 = arr[5];
        x1 = arr[0];
        x2 = arr[3];
        y1 = arr[1];
        y2 = arr[4];
    }
    let sum = r1 + r2;
    let sub = r2 - r1;
    let len = Math.sqrt((x1-x2)**2 + (y1-y2)**2);
    // console.log(sum, len);
    if(sub < len && sum > len) {
        answer += '2' + '\n';
    } else if(sum === len) {
        answer += '1' + '\n';
    } else if(sub === len && len !==0) {
        answer += '1' + '\n';
    } else if(sum < len) {
        answer += '0' + '\n';
    } else if(sub > len) {
        answer += '0' + '\n';
    } else if(len === 0) {
        if(r1 === r2) {
            answer += '-1' + '\n';
        } else {
            answer += '0' + '\n';
        }
    }
}
console.log(answer);

문제 풀이 해보자면
1. 반지름이 더 작은 쪽을 x1,y1,r1으로 정한다.
2. 두원이 어쩌구하는 상황 공식을 대입

  • 두 점에서 만난다: r2-r1 < len < r1+r2
  • 한 점에서 만난다(외접): r1+r2 = len
  • 한 점에서 만난다(내접): r2-r1 = len
  • 만나지x(외부에 존재): r1+r2 < leb
  • 만나지x(내부에 존재): len < r2-r1
  • 동심원: len = 0
    인데 코드를 위해 더 자세히 하자면
  • 두 점에서 만난다: r2-r1 < len < r1+r2
  • 한 점에서 만난다(외접): r1+r2 = len
  • 한 점에서 만난다(내접): r2-r1 = len && len !== 0(거리가 0이되면 동심원이 되니까)
  • 만나지x(외부에 존재): r1+r2 < len
  • 만나지x(내부에 존재): len < r2-r1
  • 동심원: len = 0 && r1 = r2
    이과정을 for문으로 돌리면 나온다.
post-custom-banner

0개의 댓글