문제풀이 흐름
- 모든 직선 쌍에 대해 반복
- 교점 좌표 구하기
- 정수 좌표만 저장
- 저장된 정수들에 대해 x,y 좌표의 최대값. 최솟값 구하기
- 구한 최댓값, 최솟값을 이용하여 2차원 배열의 크기 결정
- 2차원 배열에 별 표시
- 문자열 배열로 변환 후 변환
코드 작성
// 좌표 클래스
private static class Point {
public final long x, y;
private Point(long x, long y) {
this.x = x;
this.y = y;
}
}
1. 모든 직선 쌍에 대해 반복
1-A 교점 좌표 구하기
private Point intersection(long a1, long b1, long c1, long a2, long b2, long c2) {
double x = (double) (b1 * c2 - b2 * c1) / (a1 * b2 - a2 * b1);
double y = (double) (a2 * c1 - a1 * c2) / (a1 * b2 - a2 * b1);
if (x % 1 !=0 || y % 1 !=0) return null;
return new Point((long) x, (long) y);
}
1-B 정수 좌표만 저장
List<Point> points = new ArrayList<>();
for (int i = 0; i < line.length; i++) {
for(int j = i + 1; j < line.length; j++){
Point intersection = intersection(line[i][0], line[i][1], line[i][2],
line[j][0], line[j][1], line[j][2]);
if (intersection != null) {
points.add(intersection);
}
}
}
2. 저장된 정수들에 대해 x, y 좌표의 최댓값, 최솟값 구하기
private Point getMinimumPoint(List<Point> points){
long x = Long.MAX_VALUE;
long y = Long.MAX_VALUE;
for(Point p : points) {
if(p.x < x) x = p.x;
if(p.y < y) y = p.y;
}
return new Point(x,y);
}
private Point getMaximumPoint(List<Point> points){
long x = Long.MIN_VALUE;
long y = Long.MIN_VALUE;
for(Point p : points) {
if(p.x > x) x = p.x;
if(p.y > y) y = p.y;
}
return new Point(x,y);
}
3. 구한 최댓값, 최솟값을 이용하여 2차원 배열의 크기 결정
Point minimum = getMinimumPoint(points);
Point maximum = getMaximumPoint(points);
//배열 크기를 구하기 때문에 1을 더 더해줘야 한다.
int width = (int) (maximum.x - minimum.x + 1);
int height = (int) (maximum.y - minimum.y + 1);