Lewis's Tech Keep
[프로그래머스] 교점에 별 만들기 - JAVA 본문
- 링크 : https://programmers.co.kr/learn/courses/30/lessons/87377
- 풀이 :
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;
}
}
'Java > 알고리즘' 카테고리의 다른 글
[프로그래머스][JAVA] 석유 시추 (0) | 2024.07.03 |
---|---|
[BOJ] 빗물 - JAVA (0) | 2021.10.22 |
[프로그래머스] 전력망 둘로 나누기 - JAVA (0) | 2021.10.18 |
[프로그래머스] 외벽 점검 - JAVA (0) | 2021.10.06 |
[프로그래머스] 최소직사각형 - Java (0) | 2021.10.05 |
Comments