코테/프로그래머스

[프로그래머스/Level2] 교점에 별 만들기 (JAVA)

imname1am 2024. 6. 11. 22:23
반응형

📖 문제

 

프로그래머스

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

programmers.co.kr

 

 

 

 

💡  풀이 방식

• 브루트포스

 

두 직선의 교점 과표를 구해 2차원 배열에 표시한다.

이 때 문제에서 제시한 공식을 활용한다!

 

 

 

 

💥 유의사항

- A,B,C는 long 타입으로 풀기 (-10만 이상, 10만 이하의 정수이므로)

 

 

🔺 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import java.util.*;
 
class Solution {
    public String[] solution(int[][] line) {
        
        List<long[]> list = new ArrayList<>(); // 교점 저장 리스트
        
        long minX = Long.MAX_VALUE;
        long maxX = Long.MIN_VALUE;
        long minY = Long.MAX_VALUE;
        long maxY = Long.MIN_VALUE;
                
        for(int i = 0 ; i < line.length ; i++) { // 직선 1
            long a = line[i][0];
            long b = line[i][1];
            long n1 = line[i][2];
        
            for(int j = i+1 ; j < line.length ; j++) { // 직선 2
                long c = line[j][0];
                long d = line[j][1];
                long n2 = line[j][2];
                
                long xUp = b*n2 - n1*d;
                long xDown = a*- b*c;
                
                long yUp = n1*- a*n2;
                long yDown = a*- b*c;
                
                if(xDown != 0) {
                    double x = xUp / (double)xDown;
                    double y = yUp / (double)yDown;
                    
                    if(x == Math.ceil(x) && y == Math.ceil(y)) { // 정수의 경우만 저장
                        list.add(new long[] {(long)x, (long)y});
                        
                        minX = Math.min(minX, (long)x);
                        maxX = Math.max(maxX, (long)x);
                        minY = Math.min(minY, (long)y);
                        maxY = Math.max(maxY, (long)y);
                    }
                }
            }
        }
        
 
        boolean[][] answerTmp = new boolean[(int)(maxY - minY + 1)][(int)(maxX - minX + 1)];
        
        for(long[] c: list) { // 교점 처리
            int x = (int) (c[0- minX);
            int y = (int) (c[1- maxY);
            
            answerTmp[Math.abs(y)][Math.abs(x)] = true;
        }
        
 
        String[] answer = new String[answerTmp.length];
        
        int i = 0;
        for(boolean[] bb : answerTmp) {
            StringBuilder sb = new StringBuilder();
            for(boolean b : bb) {
                sb.append(b ? "*" : ".");
            }
            answer[i++= sb.toString();
        }
 
        return answer;
    }
}
cs

 

 

 

➕ 다른 풀이 방식

- 출력 부분이 조금 다르다.

 

[자바 코테대비] 교점에 별 만들기

문제 설명Ax + By + C = 0으로 표현할 수 있는 n개의 직선이 주어질 때, 이 직선의 교점 중 정수 좌표에 별을 그리려 합니다.예를 들어, 다음과 같은 직선 5개를2x - y + 4 = 0\-2x - y + 4 = 0\-y + 1 = 05x - 8y - 1

velog.io

 


💦 어려웠던 점

- long형을 써야 한다는 사실,,

- 문제에 제시된 공식을 사용할 생각을 못 했다.

 

 

🧐 새로 알게 된 내용

- 공식 활용할 아이디어

 

 

1회독 2회독 3회독 4회독 5회독
V 240625      

(참고)

 

[프로그래머스] 교점에 별 만들기(Java 자바)

https://programmers.co.kr/learn/courses/30/lessons/87377# 코딩테스트 연습 - 10주차_교점에 별 만들기 [[2, -1, 4], [-2, -1, 4], [0, -1, 1], [5, -8, -12], [5, 8, 12]] ["....*....", ".........", ".........", "*.......*", ".........", ".........

tmdrl5779.tistory.com

 

반응형