사각형 넓이 비교 문제
아래의 프로그램을 작성 하시오.
다음 멤버를 가지고 직사각형을 표현하는 Rectangle 클래스를 작성하라.
- int 타입의 x, y, width, height 필드: 사각형을 구성하는 점과 크기 정보
- x, y, width, height 값을 매개변수로 받아 필드를 초기화하는 생성자
- int square() : 사각형 넓이 리턴
- void show() : 사각형의 좌표와 넓이를 화면에 출력
- boolean contatins(Rectangle r) : 매개변수로 받은 r이 현 사각형 안에 있으면 true 리턴
- main() 메소드의 코드와 실행 결과는 다음과 같다
public static void main(String[] args) {
Rectangle r = new Rectangle(2, 2, 8, 7);
Rectangle s = new Rectangle(5, 5, 6, 6);
Rectangle t = new Rectangle(1, 1, 10, 10);
r.show();
System.out.println("s의 면적은 "+s.square());
if(t.contains(r)) System.out.println("t는 r을 포함합니다.");
if(t.contains(s)) System.out.println("t는 s를 포함합니다.");
}
(2,2)에서 크기가 8x7인 사각형
s의 면적은 36
t는 r을 포함합니다.
Rectangle 클래스
contains 함수에 대하여
한 사각형이 다른 사각형을 포함하는 의미를 코드로 표현한다.
조건1:
현 사각형의 시작 지점 x, y는 상대 사각형의 시작 지점 x, y 보다 작거나 같아야 한다.
조건2:
0부터 사각형의 시작지점까지의 길이와 사각형의 밑변의 합이 상대 사각형의 0부터 시작 지점까지의 길이와 밑변의 합 보다 크거나 같아야 한다. 높이도 같은 원리.
단순히 밑변만 비교 할 경우 사각형들의 좌표가 멀리 떨어져 있으면 포함되지 않는다. 0부터 시작지점까지의 길이까지 합쳐야 한다. 높이도 같은 원리.
잘못된 조건2:
현 사각형의 0부터 시작지점까지의 길이와 밑변의 합과 상대 사각형의 밑변을 비교 할 경우도 좌표가 멀리 떨어져 있으면 포함되지 않는다. 높이도 같은 원리.
0부터 시작지점까지의 길이: 1
밑변: 10
합: 11
사각형 B
0부터 시작지점까지의 길이: 5
밑변: 7
합: 12
사각형A의 0부터 시작지점까지의 길이와 밑변의 합인 11은 사각형B의 밑변인 7 보다 크지만 사각형B를 포함하지 않는다.
출력결과에 대하여:
문제요구 결과:
(2,2)에서 크기가 8x7인 사각형
s의 면적은 36
t는 r을 포함합니다.
실제 출력 결과:
사각형 t 와 사각형 s 모두 밑변과 0부터 시작지점까지의 길이가 11이다.
그림에서도 사각형의 외곽 선이 겹쳐있다.
상대 사각형의 x2와 y2의 값은 저장된 적이 없으므로 무조건 현 사각형의 값이 높게 나온다.
실제로 contains 메소드가 실행될 때 상대 사각형의 x2, y2 값을 찍어보면 0으로 나온다.
값이 정상적으로 찍히는 모습이다.
끝.
소스코드:
package pad;
public class Pad {
public static void main(String[] args) {
Rectangle r = new Rectangle(2, 2, 8, 7);
Rectangle s = new Rectangle(5, 5, 6, 6);
Rectangle t = new Rectangle(1, 1, 10, 10);
r.show();
System.out.println("s의 면적은 " + s.square());
if (t.contains(r))
System.out.println("t는 r을 포함합니다.");
if (t.contains(s))
System.out.println("t는 s를 포함합니다.");
}
}
class Rectangle {
private int x, y, width, height;
public Rectangle(int x, int y, int width, int height) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
public int square() {
return this.width * this.height;
}
public void show() {
System.out.println(
"(" + x + "," + y + ")에서 크기가 " +
this.width + "x" + this.height + "인 사각형"
);
}
public boolean contains(Rectangle r) {
return (
this.x <= r.x &&
this.y <= r.y &&
this.x + this.width >= r.x + r.width &&
this.y + this.height >= r.y + r.height
) ? true : false;
}
}
댓글
댓글 쓰기