프로그래머스 - 교점에 별 만들기 - 배열 - Java

chaemin·2024년 6월 5일
0

프로그래머스

목록 보기
50/64

1. 문제

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

2. 풀이

먼저 답지를 보지 않고 혼자 생각해서 풀었다.👍앞으로도 이렇게 혼자 잘 헤쳐나가도록 하자.

해당 문제의 포인트는

    1. 교점 구하기(정수인것만)
    1. 교점의 최대/최소 값들로 배열 구성하기.

✨핵심 Point - 제한사항을 잘 읽자.

  1. 범위가 굉장히 크기 때문에 교점의 좌표의 자료형은 Long으로 설정해야한다.
  1. 구한 교점의 좌표가 정수인지 파악하는 여부
if( (pointX % 1 == 0) && (pointY % 1 == 0) )
  1. X좌표와 Y좌표가 배열로 표지되었을때는 map[Y][X]가 된다는걸 명심하기.
  1. String[] -> String은 String.join으로 설정한다.
answer[i] = String.join("", map[i]);

3. 전체코드

import java.util.*;

class Solution {
    ArrayList<Long> listX = new ArrayList<>();
    ArrayList<Long> listY = new ArrayList<>();
    
    public String[] solution(int[][] line) {
        for(int i = 0; i < line.length; i++){
            for(int j = i + 1; j < line.length; j++){
                checkLine(line[i][0], line[i][1], line[i][2], line[j][0], line[j][1], line[j][2]);
            }
        }
        
        long minX = Collections.min(listX);
        long maxX = Collections.max(listX);
        long minY = Collections.min(listY);
        long maxY = Collections.max(listY);
        
        int n = (int)Math.abs(minX - maxX) + 1;
        int m = (int)Math.abs(minY - maxY) + 1;
        
        String[][] map = new String[m][n];
        for(int i = 0; i < m; i++)
            Arrays.fill(map[i], ".");
        
        for(int i = 0; i < listX.size(); i++){
            int locateX = (int) Math.abs(minX - listX.get(i));
            //int locateY = (int) Math.abs(maxY - listY.get(i));
            int locateY = (int) Math.abs(listY.get(i) - maxY);
            
            map[locateY][locateX] = "*";
        }
        
        String[] answer = new String[map.length];
        for(int i = 0; i < map.length; i++){
            answer[i] = String.join("", map[i]);
        }
        return answer;
    }
    
    public void checkLine(long a, long b, long e, int c, int d, int f){
        
        if( (a * d - b * c) == 0 )
            return;
        double pointX = (double) (b * f - e * d) / (a * d - b * c);
        double pointY = (double) (e * c - a * f) / (a * d - b * c);
        
        if( (pointX % 1 == 0) && (pointY % 1 == 0) ){
            listX.add((long)pointX);
            listY.add((long)pointY);
        }
    }
}

0개의 댓글