https://school.programmers.co.kr/learn/courses/30/lessons/87377
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
나의 풀이
import java.util.Arrays;
import java.util.HashSet;
// 교점에 별 만들기
class Solution {
public String[] solution(int[][] line) {
// 무한한 grid 의 범위를 제한하기 위한 최대, 최소값
long maxX = Long.MIN_VALUE;
long maxY = Long.MIN_VALUE;
long minX = Long.MAX_VALUE;
long minY = Long.MAX_VALUE;
HashSet<Coordinate> cSet = new HashSet<>();
for (int i = 0; i < line.length; i++) {
long a = line[i][0]; // 'long' 으로 자동 형변환
long b = line[i][1];
long e = line[i][2];
for (int j = i + 1; j < line.length; j++) {
long c = line[j][0];
long d = line[j][1];
long f = line[j][2];
if ((a*d - b*c) == 0) continue; // '0'으로 나눌 수 없기 때문에 패스
double x = (double) (b*f - e*d) / (a*d - b*c);
double y = (double) (e*c - a*f) / (a*d - b*c);
if (x % 1 != 0) continue; // 정수가 아닐 경우 패스
if (y % 1 != 0) continue; // 정수가 아닐 경우 패스
cSet.add(new Coordinate((long)x, (long)y));
minX = Math.min(minX, (long)x);
maxX = Math.max(maxX, (long)x);
minY = Math.min(minY, (long)y);
maxY = Math.max(maxY, (long)y);
}
}
StringBuilder sb = new StringBuilder();
for (int x = (int)minX; x <= maxX; x++){
sb.append('.');
}
String[] answer = new String[(int)(maxY - minY + 1)];
Arrays.fill(answer, sb.toString()); // 지정된 크기의 board 에 '.'으로 채운다.
long nx, ny;
for (Coordinate c : cSet) {
ny = maxY - (int)c.y; // 교점의 좌표를 찾아가서 해당 부분을 '*'로 바꾼다.
nx = (int)c.x - minX; // grid 는 행과 열이 반대인 거 주의!
answer[(int)ny] = answer[(int)ny].substring(0, (int)nx) + "*"
+ answer[(int)ny].substring((int)nx + 1);
}
return answer;
}
}
class Coordinate {
long x;
long y;
Coordinate(long x, long y) {
this.x = x;
this.y = y;
}
}