Javascript/자바스크립트 문제

[Javascript] Rectangle 클래스에 넓이 계산, 사각형 겹침 판단 함수 만들기

isfp_yykkng 2023. 3. 27. 01:15

Rectangle 클래스에 넓이 계산, 사각형 겹침 판단 함수만들기

문제

아래에 서술된 기능을 하는 Shape 클래스를 기반으로 한 Rectangle 클래스를 만드시오.

------------------ 아 래 ----------------------

ES6 class를 이용해서 Rectangle클래스를 만드세요

area, overlap 두개 메소드 함수가 포함 되어 있어야 합니다.

아래 예시처럼 정사각형 사이에 겹치는지 체크한 이후 넓이를 출력하는 테스트를 통과해야 합니다.

class Rectangle extends Shape {

    ....

}

const a = new Rectangle(100,100,15);

const b = new Rectangle(90,90,10);

const c = new Rectangle(50,50, 10);

if (a.overlap(b)) {

     console.log(a.area()); // 225출력

}

if (a.overlap(c)) {

     console.log(c.area()); // 100출력

}

 

풀이

넓이를 계산하는 함수 area()는 Shape 클래스에서 받아온 것을 사용하는 것이 전제조건이다. 따라서 area 함수에 기본적인 return 0 을 하는 구문 작성한다.

위의 예시처럼 Rectangle 클래스를 생성할 때 필요한 생성자를 작성하는데 생성자는 위의 예시처럼 중심x좌표, 중심y좌표, 한변의 길이 를 매개변수로 가진다. 이를 이용해서 주어진 한변의 길이를 이용해서 Rectangle 클래스의 area() 함수를 작성할 수 있다.

 

overlap 함수 즉, 사각형이 겹치는 곳이 있나를 판단하는 함수로, Rectangle 클래스에서 새롭게 작성한다. 사각형이 겹치는지 유무를 판단하여 true/false를 반환한다. 

내가 생각했을 때 두 사각형이 겹치는 경우의 수를 구하는 경우의 수보다 겹치지 않는 경우의 수가 더 적다고 생각했다.

내가 생각한 두 사각형이 겹치지 않는 경우의 수는 다음과 같다.

  • 기존 사각형의 우측 하단 x좌표보다 비교할 사각형의 좌측 상단 x좌표가 작은 경우
  • 기존 사각형의 우측 하단 y좌표보다 비교할 사각형의 좌측 상단 y좌표가 큰 경우
  • 기존 사각형의 좌측 상단 x좌표보다 비교할 사각형의 우측 하단 x좌표가 작은 경우
  • 기존 사각형의 좌측 상단 y좌표보다 비교할 사각형의 우측 하단 y좌표가 큰 경우

위의 경우를 모두 OR연산으로 묶어주어 조건식을 완성한다.

코드 구현

코드는 Javascript로 ES6 문법을 기반으로 한다.

class Shape {
  static create(x, y) {
    return new Shape(x, y);
  }
  name = "Shape";
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }
  area() {
    return 0;
  }
}
class Rectangle extends Shape {
  constructor(x, y, n) {
    super(x, y); // 부모에서 받아오기
    this.n = n;
  }
  area() {
    if (this.n == 0) return super.area();
    return this.n * this.n;
  }
  overlap(aRect) {
    //기존 사각형 좌표
    let x1 = this.x + this.n / 2; //우하단 x값
    let y1 = this.y - this.n / 2; //우하단 y값
    let x2 = this.x - this.n / 2; //좌상단 x값
    let y2 = this.y + this.n / 2; //좌상단 y값

    //비교할 사각형 좌표
    let ax1 = aRect.x + aRect.n / 2; //우하단 x값
    let ay1 = aRect.y - aRect.n / 2; //우하단 y값
    let ax2 = aRect.x + aRect.n / 2; //좌상단 x값
    let ay2 = aRect.y + aRect.n / 2; //좌상단 y값
	
    if ((ax1 <= x2) | (ay1 >= y2) | (ax2 >= x1) | (ay2 <= y1)) return false; //겹치지 않는 경우
    return true; //겹치는 경우
  }
}
const a = new Rectangle(100, 100, 15);
const b = new Rectangle(90, 90, 10);
const c = new Rectangle(50, 50, 10);
if (a.overlap(b)) {
  console.log(a.area());
}
if (a.overlap(c)) {
  console.log(c.area());
}

내가 생각한 경우의 수 계산이 틀렸을 수도 있다. 참고만 해주시길..

교수님의 답과 비교해서 수정하겠습니다 ㅎㅎ!