CodingTest

프로그래머스 // 교점에 별 만들기 LEVEL 2

dding-shark 2024. 11. 26. 15:14
728x90

문제

 [https://school.programmers.co.kr/learn/courses/30/lessons/87377]
들어가서 보면 알겠지만, 단순하다면... 단순한? 문제 이다.

풀이(해설):

  • 문제를 읽고 :
    • 교점을 구하는 식과, 무조건 교점이 생기고, 같은 직선은 안주는 조금 인심좋은 문제라고 생각하고 가볍게 들어갔디... (물론 이래서 애를 많이 먹었다...)
      • 제한사항을 읽어보니 2*1(00,000^2) 정도 범위가 나올거 같고, long을 이용해서 정수형을 사용해야 겠다. 라고 다짐하며 풀이에 들어갔다.
    • 문제풀이 전략 :
      • 간단하게 문제에서 하라는 대로 하면 될거같다.
        1. 식을 이용하여 교점을 구하기.
        2. 정수좌표만 포함하는 교점인지 판단하기.
        3. min, max 판단해서 크기랑 그림 평행이동 시키기
        4. 캔버스를 알맞게 그리기.
        5. 교점에 \*칠하기.
      • 문제풀이(Code)
      1. 본능적인 Point 클래스 만들기.
class Point
        {
            long x;
            long y;

            public Point(long x, long y)
            {
                this.x = x;
                this.y = y;
            }
        }
  1. 구하라는 대로 구한 Solution 클래스
    1. 좀 깔끔하게 문제를 풀어야 겠다.. 라고 다짐한 문제이다...
    2. 사실 체점하기 누르고 29번 Case에서 틀렸는데...
      멍청하게 계산중에 int범위를 넘어간다고 말했으면서 정작 공식에 대입할땐 int인걸 까먹고 (double) 변환한 나는짱.. 이러면서 덤벙 거려서 조금 해맸다...
class Solution {
    public String[] solution(int[][] line) {


        List<Point> points = new ArrayList<>();
        for(int i =0 ; i<line.length; i++)
        {
            for( int j =0 ; j<line.length ; j++)
            {
                double x = (double)((long)line[i][1]*(long)line[j][2] - (long)line[i][2]*(long)line[j][1]) / ((long)line[i][0]*(long)line[j][1] - (long)line[i][1]*(long)line[j][0]);
                double y = (double)((long)line[i][2]*(long)line[j][0] - (long)line[i][0]*(long)line[j][2]) /((long)line[i][0]*(long)line[j][1] - (long)line[i][1]*(long)line[j][0]);

                // 이부분 인데... 원래라면 좀 가독성있게 하고싶었지만,,, 하다보니 (long) 떡칠만 하면 풀수는 있어서.. 죄송합니당..
                if(x % 1 ==0 && y%1 == 0)
                {
                    points.add(new Point((long)x,(long)y));
                }

            }
        }


        // min max
        long min_x = Long.MAX_VALUE;
        long min_y = Long.MAX_VALUE;
        long max_x = Long.MIN_VALUE;
        long max_y = Long.MIN_VALUE;

        for(Point p : points)
        {
            if(p.x < min_x)
            {
                min_x = p.x;
            }
            if(p.y < min_y)
            {
                min_y = p.y;
            }
            if(p.x > max_x)
            {
                max_x = p.x;
            }
            if(p.y > max_y)
            {
                max_y = p.y;
            }
        }


        int height = (int)(max_y - min_y +1);
        int weidth = (int)(max_x - min_x +1);





        char[][] canvers = new char[height][weidth];
        for(char[] row : canvers)
        {
            Arrays.fill(row,'.');
        }

        for(Point p : points)
        {
            int x = (int) p.x - (int)min_x;
            int y = (int) p.y - (int)min_y;
            canvers[y][x] = '*';
        }


        String[] answer = new String[canvers.length];
        for(int i=0 ; i<answer.length;i++)
        {
            answer[answer.length -i -1] = new String(canvers[i]);
        }
        return answer;
    }
}
728x90