더북(TheBook)

전체 코드

3장/교점에_별_만들기.java

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Solution {
    private static class Point {
        public final long x, y;

        private Point(long x, long y) {
            this.x = x;
            this.y = y;
        }
    }

    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);
    }

    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);
    }

    public String[] solution(int[][] line) {
        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); } } } Point minimum = getMinimumPoint(points); Point maximum = getMaximumPoint(points); int width = (int) (maximum.x - minimum.x + 1); int height = (int) (maximum.y - minimum.y + 1); char[][] arr = new char[height][width]; for (char[] row : arr) { Arrays.fill(row, '.'); } for (Point p : points) { int x = (int) (p.x - minimum.x); int y = (int) (maximum.y - p.y); arr[y][x] = '*'; } String[] result = new String[arr.length]; for (int i = 0; i < result.length; i++) { result[i] = new String(arr[i]); } return result; } }
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.