Lewis's Tech Keep

[프로그래머스] 교점에 별 만들기 - JAVA 본문

Java/알고리즘

[프로그래머스] 교점에 별 만들기 - JAVA

Lewis Seo 2021. 10. 20. 15:49

- 링크 : https://programmers.co.kr/learn/courses/30/lessons/87377

 

코딩테스트 연습 - 10주차_교점에 별 만들기

[[2, -1, 4], [-2, -1, 4], [0, -1, 1], [5, -8, -12], [5, 8, 12]] ["....*....", ".........", ".........", "*.......*", ".........", ".........", ".........", ".........", "*.......*"] [[0, 1, -1], [1, 0, -1], [1, 0, 1]] ["*.*"] [[1, -1, 0], [2, -1, 0], [4, -

programmers.co.kr

 

- 참고 링크 : https://taehoung0102.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4Java-Level2-%EA%B5%90%EC%A0%90%EC%97%90-%EB%B3%84-%EB%A7%8C%EB%93%A4%EA%B8%B0-%EC%9C%84%ED%81%B4%EB%A6%AC-%EC%B1%8C%EB%A6%B0%EC%A7%80-10%EC%A3%BC%EC%B0%A8

 

[프로그래머스,Java] Level2: 교점에 별 만들기 [위클리 챌린지 10주차]

https://programmers.co.kr/learn/courses/30/lessons/87377 코딩테스트 연습 - 10주차 [[2, -1, 4], [-2, -1, 4], [0, -1, 1], [5, -8, -12], [5, 8, 12]] ["....*....", ".........", ".........", "*.......*",..

taehoung0102.tistory.com

 

 

 

 

 

- 풀이 : 

 1. 교점두 직선을 기준으로는 0개 또는 1개만 존재 할 수 있다. (2개 이상은 곡선이 존재한다는 뜻)

 2. 교점을 찾는 공식이 친절하게 있기 때문에 이를 이용해서 각 직선 마다 교점을 구한다.

 3. 이 교점 중에 x, y가 모두 정수인 경우를 찾는다. (point 성립) 그리고 배열 points에 point를 저장한다.

 4. 원하는 정답을 도출하기 위해서 맵을 만들고 해당 점을 발견 했을 경우 "*", 아닌 경우 "." 을 찍어준다.

 

 생각보다 로직은 빨리 도출 해냈지만 나눗셈을 하고 정수를 확인을 했는데

 정수 확인법 중

 분모와 분자가 0으로 나누어떨어지면 된다는 생각을 못했다.

 내가 사용했던 것은

 나눈 뒤에 1로 나머지 연산을 해서 0이면 된다라고 생각했기에 double을 사용 하였는데

 이 경우 최대 값 끼리 곱하기 연산을 했을 경우 값이 최대값 보다 커져서 case 28 번에서 에러를 맞이했다.

 고민고민하다가 참고 링크를 보고 아차했다. 

 

 

- 답 :

더보기
import java.util.*;

class Solution {
    public String[] solution(int[][] line) {
        List<Point> points = new ArrayList<Point>();

        for (int i=0; i<line.length-1; i++) {
            long a = line[i][0];
            long b = line[i][1];
            long e = line[i][2];
            Line l1 = new Line(a, b, e);
            for (int j=i+1; j<line.length; j++) {
                long c = line[j][0];
                long d = line[j][1];
                long f = line[j][2];
                Line l2 = new Line(c, d, f);

                if (isParallel(l1, l2)) {
                    continue;
                }

                long adbc = getADBC(l1, l2);
                long bfed = getBFED(l1, l2);
                long ecaf = getECAF(l1, l2);

                if (isDecimalNumber(bfed, adbc) && isDecimalNumber(ecaf, adbc)) {
                    int x = (int) (bfed / adbc);
                    int y = (int) (ecaf / adbc);
                    points.add(new Point(x, y));
                }
            }
        }

        int minX = points.get(0).x;
        int maxX = points.get(0).x;
        int minY = points.get(0).y;
        int maxY = points.get(0).y;

        for (Point p : points) {
            minX = Math.min(minX, p.x);
            maxX = Math.max(maxX, p.x);

            minY = Math.min(minY, p.y);
            maxY = Math.max(maxY, p.y);
        }

        int rowCount = maxY - minY + 1;
        int rowIdx = 0;
        String[] answer = new String[rowCount];
        for (int i=maxY; i >= minY; i--) {
            String rowStr = "";
            for (int j=minX; j <= maxX; j++) {
                if (hasPoint(j, i, points)) {
                    rowStr += "*";
                    continue;
                }

                rowStr += ".";
            }

            // System.out.println(rowStr);
            answer[rowIdx] = rowStr;
            rowIdx++;
        }

        return answer;
    }

    private boolean hasPoint(int x, int y, List<Point> points) {
        for (Point p: points) {
            if (p.x == x && p.y == y) {
                return true;
            }
        }

        return false;
    }

    private boolean isParallel(Line l1, Line l2) {
        return getADBC(l1, l2) == 0;
    }

    private boolean isDecimalNumber(long dividend, long divisor) {
        return dividend % divisor == 0;
    }

    private long getADBC(Line l1, Line l2) {
        return (l1.x * l2.y) - (l2.x * l1.y);
    }

    private long getBFED(Line l1, Line l2) {
        return (l1.y * l2.h) - (l1.h * l2.y);
    }

    private long getECAF(Line l1, Line l2) {
        return (l1.h * l2.x) - (l1.x * l2.h);
    }
}

class Line {
    long x;
    long y;
    long h;

    Line(long x, long y, long h) {
        this.x = x;
        this.y = y;
        this.h = h;
    }
}

class Point {
    int x;
    int y;

    Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}
Comments