프로그래머스 레벨 2의 마지막 문제였다.
레벨 1, 2의 문제를 모두 풀어서 약간의 성취감이 느껴졌다.
정답률이 낮아서 어렵겠다 싶었는데 문제 맨 밑에 교점을 구하는 공식을 주었기 때문에 생각보다는 쉬운 편이었다.
로직
line 배열을 순회하며 2개의 식의 교점을 찾는다.
AD - BC가 0이면 0으로 나눌 수 없기 때문에 반환하고 찾은 좌표가 정수인지 판별하여 정수라면 list에 저장한다.
그리고 x, y의 최댓, 최솟값을 MinMax 배열에 저장한다. 별을 찍을때 최댓, 최솟값이 배열의 경계가 되기 때문이다.
x, y의 최솟값부터 최댓값까지를 순회하며 list에 저장된 교점의 좌표가 나오면 *을 찍고 그게 아니라면 . 을 찍어 문자열로 만든다.
최종 코드
import java.util.*;
class Solution {
static List<int[]> list;
static int[] xMinMax;
static int[] yMinMax;
public String[] solution(int[][] line) {
list = new ArrayList<>();
xMinMax = new int[] {Integer.MAX_VALUE, Integer.MIN_VALUE};
yMinMax = new int[] {Integer.MAX_VALUE, Integer.MIN_VALUE};
// line 배열을 순회하며 교점 구하기
for (int i = 0; i < line.length; i++) {
for (int j = i + 1; j < line.length; j++) {
makePoint(line[i][0], line[i][1], line[i][2], line[j][0], line[j][1], line[j][2]);
}
}
// 교점을 저장하기 위한 list
List<String> arr = new ArrayList<>();
// x,y의 좌표의 최솟값부터 최댓값까지 순회
for (int i = yMinMax[1]; i >= yMinMax[0]; i--) {
StringBuilder sb = new StringBuilder();
for (int j = xMinMax[0]; j <= xMinMax[1]; j++) {
// 별을 만들면서 교점의 좌표에는 *찍기
boolean flag = false;
// list에서 교점과 일치하는지 확인
for (int k = 0; k < list.size(); k++) {
int x = list.get(k)[0];
int y = list.get(k)[1];
if(i == y && j == x) {
sb.append("*");
flag = true;
break;
}
}
// 교점이 아니면 . 찍기
if(!flag) {
sb.append(".");
}
}
arr.add(sb.toString());
}
// answer 배열에 복사
String[] answer = new String[arr.size()];
for (int i = 0; i < arr.size(); i++) {
answer[i] = arr.get(i);
}
return answer;
}
// 교점을 구하는 메서드
static void makePoint(long a, long b, long e, long c, long d, long f) {
// 분모가 0이면
if((a * d - b * c) == 0) {
return;
}
long x = (b * f - e * d) / (a * d - b * c);
long y = (e * c - a * f) / (a * d - b * c);
// 좌표가 정수라면
if((b * f - e * d) % (a * d - b * c) == 0 && (e * c - a * f) % (a * d - b * c) == 0) {
list.add(new int[] {(int)x, (int) y});
// x,y 좌표의 최댓, 최솟값 저장
xMinMax[0] = Math.min(xMinMax[0], (int)x);
xMinMax[1] = Math.max(xMinMax[1], (int)x);
yMinMax[0] = Math.min(yMinMax[0], (int)y);
yMinMax[1] = Math.max(yMinMax[1], (int)y);
}
}
}
'코딩 테스트' 카테고리의 다른 글
(Java) 프로그래머스 - 이중우선순위큐 (0) | 2022.09.30 |
---|---|
(Java) 프로그래머스 - 정수 삼각형 (0) | 2022.09.29 |
(Java) 프로그래머스 - 방금그곡 (0) | 2022.09.26 |
(Java) 프로그래머스 - 쿼드 압축 후 개수 세기 (0) | 2022.09.23 |
(Java) 프로그래머스 - 방문 길이 (1) | 2022.09.21 |