프로그래머스 코딩 테스트 문제/lv2

프로래머스 Lv2 교점에 별 만들기 문제

lys4321 2026. 2. 24. 02:04
  • 프로래머스 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);
        }
    }
}