programmers_교점에 별 만들기_java

2023. 6. 1. 11:46Algorithm/Programmers

728x90

https://school.programmers.co.kr/learn/courses/30/lessons/87377

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

import java.util.*;

class Solution {

    public String[] solution(int[][] line) {
        String[] answer = {};

        long miny = Long.MAX_VALUE;
        long maxy = Long.MIN_VALUE;
        long minx = Long.MAX_VALUE;
        long maxx = Long.MIN_VALUE;

        // 정수 값을 갖는 교점 리스트
        List<long[]> pointList = new ArrayList<>();
        for (int i = 0; i<line.length; i++){
            for (int j = i+1; j<line.length; j++){
                long[] intersectionPoint = findIntersectionPoint(line[i], line[j]);
                if (intersectionPoint != null){
                    miny = Math.min(miny, intersectionPoint[1]);
                    maxy = Math.max(maxy, intersectionPoint[1]);
                    minx = Math.min(minx, intersectionPoint[0]);
                    maxx = Math.max(maxx, intersectionPoint[0]);

                    pointList.add(intersectionPoint);
                }
            }
        }

        // map 배열 생성 및 초기화
        char[][] map = new char[(int)(maxy - miny + 1)][(int)(maxx - minx + 1)];
        for (int i = 0; i<map.length; i++){
            Arrays.fill(map[i], '.');
        }

        // 교점 입력
        for (long[] point : pointList){
            int x = (int)(point[0] - minx);
            int y = (int)(point[1] - miny);
            map[y][x] = '*';
        }

        // char[][] -> String[]
        // 음수가 아래로 가도록
        answer = new String[map.length];
        for (int i = 0; i<map.length; i++){
            StringBuilder sb = new StringBuilder();
            for (int j = 0; j<map[i].length; j++){
                sb.append(map[i][j]);
            }
            answer[map.length - i - 1] = sb.toString();
        }

        return answer;
    }

    // x, y가 정수 값인 교점 찾기(int -> 오버플로우, double -> 오류)
    public long[] findIntersectionPoint(int[] line1, int[] line2){
        long A = line1[0];
        long B = line1[1];
        long E = line1[2];
        long C = line2[0];
        long D = line2[1];
        long F = line2[2];

        long[] point = new long[2];

        if((A * D - B * C) != 0){
            if((B * F - E * D) % (A * D - B * C) == 0){
                point[0] = (B * F - E * D) / (A * D - B * C);
            }else{
                return null;
            }
            if((E * C - A * F) % (A * D - B * C) == 0){
                point[1] = (E * C - A * F) / (A * D - B * C);
            }else{
                return null;
            }
        }else {
            return null;
        }

        return point;
    }

}