문제풀이 흐름

  1. 모든 직선 쌍에 대해 반복
    1. 교점 좌표 구하기
    2. 정수 좌표만 저장
  2. 저장된 정수들에 대해 x,y 좌표의 최대값. 최솟값 구하기
  3. 구한 최댓값, 최솟값을 이용하여 2차원 배열의 크기 결정
  4. 2차원 배열에 별 표시
  5. 문자열 배열로 변환 후 변환

코드 작성

// 좌표 클래스
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);