사각형 넓이 비교 문제

 

아래의 프로그램을 작성 하시오.

 

다음 멤버를 가지고 직사각형을 표현하는 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부터 시작 지점까지의 길이와 밑변의 합 보다 크거나 같아야 한다. 높이도 같은 원리.


잘못된 조건1:
단순히 밑변만 비교 할 경우 사각형들의 좌표가 멀리 떨어져 있으면 포함되지 않는다. 0부터 시작지점까지의 길이까지 합쳐야 한다. 높이도 같은 원리.

잘못된 조건2: 
현 사각형의 0부터 시작지점까지의 길이와 밑변의 합과 상대 사각형의 밑변을 비교 할 경우도 좌표가 멀리 떨어져 있으면 포함되지 않는다. 높이도 같은 원리.


사각형 A
    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이다. 
그림에서도 사각형의 외곽 선이 겹쳐있다.


조건문의 크거나 같다와 작거나 같다 부호를 단순히 크다와 작다로 바꾸면 해결된다.



정답지의 오류:


정답지의 contains 메소드를 보면 x2와 y2라는 추가로 만든 전역변수의 값에 0부터 시작지점까지의 거리와 밑변 또는 높이의 합의 값을 저장한다. 

그리고 이 값들을 상대 사각형의 x2, y2와 각각 비교한다.
상대 사각형의 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;
}
}














댓글

이 블로그의 인기 게시물

substring 예제: 문자열을 입력 받아 한 글자씩 회전시켜 모두 출력하는 프로그램을 작성하라

단체 채팅 구현