문제 : https://programmers.co.kr/learn/courses/30/lessons/87377
1. 파이썬 풀이
from itertools import combinations
# solutio 1 : combinations 사용
def solution(line):
answer = []
INF = float('inf')
intersections=[]
max_x=-INF
min_x=INF
max_y=-INF
min_y=INF
# 문제에 나온 공식대로 모든 정수 교차점과 좌표의 최대/최솟값을 구합니다.
for first,second in combinations(line,2):
a,b,e = first
c,d,f = second
mod = (a*d - b*c)
if mod==0:
continue
x = (b * f - e * d) / mod
y = (e * c - a * f) / mod
if x!=int(x) or y!=int(y):
continue
x=int(x)
y=int(y)
intersections.append((x,y))
max_x = max(x, max_x)
min_x = min(x, min_x)
max_y = max(y, max_y)
min_y = min(y, min_y)
# 너비와 높이를 계산 후, 별을 찍습니다.
h=max_y-min_y+1
w=max_x-min_x+1
matrix = [['.'] * w for _ in range(h)]
for x,y in intersections:
matrix[max_y-y][x-min_x] = '*'
for i in range(h):
answer.append("".join(matrix[i]))
return answer
포인트
1. 높이는 maxY - minY + 1가 되고 너비는 maxX - minX + 1가 됩니다.
별을 찍을 때는 그래프 안에 있는 점들을 1사분면에 옮긴다 생각하시면 되는데
그 이유는 컴퓨터의 2차원 배열이 그래프의 1사분면을 뒤집은 형태로 표현되기 때문입니다.
그래서 y좌표 = maxY - y, x좌표 = x - minX의 결과가 나옵니다.
2. 자바 풀이
import java.util.*;
public String[] solution(int[][] line) {
List<long[]> list = new ArrayList<>();
int n = line.length;
long max_X = Long.MIN_VALUE, max_Y = Long.MIN_VALUE, min_X = Long.MAX_VALUE, min_Y =Long.MAX_VALUE;
for(int i=0;i<n-1;i++){
for(int j=i+1;j<n;j++){
double a=line[i][0], b=line[i][1], e=line[i][2], c=line[j][0], d=line[j][1], f=line[j][2];
double mod = a*d - b*c;
if(mod == 0) continue;
double x=(b*f-e*d)/mod, y=(e*c-a*f)/mod;
long ix=(long)x; long iy=(long)y;
if(x== ix && y==iy) {
min_X = Math.min(ix, min_X);
max_X = Math.max(ix, max_X);
min_Y = Math.min(iy, min_Y);
max_Y = Math.max(iy, max_Y);
list.add(new long[] { ix, iy });
}
}
}
int h = (int)(max_Y - min_Y + 1);
int w = (int)(max_X-min_X + 1);
char[][] map = new char[h][w];
for(char[] m : map) Arrays.fill(m, '.');
for(long[] a : list) map[(int)(max_Y -a[1])][(int)(a[0] -min_X)] = '*';
String[] answer = new String[map.length];
for(int i = 0; i < map.length; i++) answer[i] = new String(map[i]);
return answer;
}
배울 점
1. 무한에 수렴하는 큰 값 표현할 때, Long.MIN_VALUE, Long.MIN_VALUE 사용
2. char 배열 빈 칸 채울 때, Arrays.fill(m, '.'); 사용
3. foreach 문 활용하여 심플하게 나타내기. for(long[] a : list) map[(int)(max_Y -a[1])][(int)(a[0] -min_X)] = '*';
'코딩 테스트 > 프로그래머스 - 일반' 카테고리의 다른 글
레벨2. 이중우선순위큐 (0) | 2021.11.19 |
---|---|
level 2.소수 찾기 (0) | 2021.10.23 |