- 프로래머스 Lv2 교점에 별 만들기 문제
- 해당 문제의 난이도 상승 원인
- 크래머 공식의 앎 여부
- 공백('.') 공간 처리법
- 해당 문제를 해결한 방법
- 크래머 공식이 뭔지 조사하고 이해를 한 후 작업 시작
- 처음 방식에서 변경한 방식
- 처음
- 크래머 공식을 사용해 값을 알아낸 후, 해당 좌표로 순환하여 좌표에는 *을 찍고 나머지는 '.'을 찍도록 하였었음
- 변경
- 그러나 '.' 처리하는 부분에 대하여 생각보다 공수량이 많아져 이에 대하여 쉬운 방법을 선택
- 문제의 핵심
- y 값이 달라질 때 그 차이에 대한 공백 처리 및 전체 가로줄의 길이를 구하기
- 이 문제의 목적
- 크래머 공식에 대한 학습
- long을 사용한 값 처리
package CreateStarAtintersec;
import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.stream.Collectors;
class CreateStarAtintersec {
public String[] solution(int[][] line) {
long[] xDist = {Long.MAX_VALUE, Long.MIN_VALUE};
long[] yDist = {Long.MAX_VALUE, Long.MIN_VALUE};
int[][] refined = new int[line.length][];
int idx = 0;
for(int i = 0; i < line.length; i++){
int[] stdr = line[i];
for(int j = i+1; j < line.length; j++){
if(refined[j] != null) continue;
int[] target = line[j];
long cramer_main = (long)stdr[0] * (long)target[1] - (long)stdr[1] * (long)target[0];
if(cramer_main == 0){ continue; }
else{
long cramer_sub_x = (long)stdr[2] * (long)target[1] - (long)stdr[1] * (long)target[2];
long cramer_sub_y = (long)stdr[2] * (long)target[0] - (long)stdr[0] * (long)target[2];
if(cramer_sub_x % cramer_main != 0 || cramer_sub_y % cramer_main != 0) continue;
xDist[0] = Math.min(xDist[0], (cramer_sub_x / cramer_main));
xDist[1] = Math.max(xDist[1], (cramer_sub_x / cramer_main));
yDist[0] = Math.min(yDist[0], (cramer_sub_y / cramer_main));
yDist[1] = Math.max(yDist[1], (cramer_sub_y / cramer_main));
refined[idx] = (new int[]{(int)(cramer_sub_x / cramer_main), (int)(cramer_sub_y / cramer_main)});
idx++;
}
}
}
Arrays.sort(refined, (obj1, obj2) -> {
if(obj1 == null) return 1;
if(obj2 == null) return -1;
if(obj1[1] == obj2[1]){
return Integer.compare(obj1[0], obj2[0]);
}
return Integer.compare(obj2[1], obj1[1]);
});
int xLen = (int)(xDist[1] - xDist[0]) + 1;
int yLen = (int)(yDist[1] - yDist[0]) + 1;
String[] starPointArr = new String[yLen];
for(int i = 0; i < starPointArr.length; i++){
starPointArr[i] = ".".repeat(xLen);
}
for(int i = 0; i < refined.length; i++){
if(refined[i] == null) break;
int xp = Math.abs(refined[i][0] - (int)(xDist[1]));
int yp = Math.abs(refined[i][1] - (int)(yDist[1]));
StringBuilder sb = new StringBuilder(starPointArr[yp]);
sb.setCharAt(xp, '*');
starPointArr[yp] = sb.toString();
}
String[] answer = starPointArr;
return answer;
}
public static void main(String[] args) {
int[][] line = {
{2, -1, 4},
{-2, -1, 4},
{0, -1, 1},
{5, -8, -12},
{5, 8, 12}
};
CreateStarAtintersec sa = new CreateStarAtintersec();
for(String s : sa.solution(line)){
System.out.println(s);
}
}
}