728x90
문제
[https://school.programmers.co.kr/learn/courses/30/lessons/87377]
들어가서 보면 알겠지만, 단순하다면... 단순한? 문제 이다.
풀이(해설):
- 문제를 읽고 :
- 교점을 구하는 식과, 무조건 교점이 생기고, 같은 직선은 안주는 조금 인심좋은 문제라고 생각하고 가볍게 들어갔디... (물론 이래서 애를 많이 먹었다...)
- 제한사항을 읽어보니 2*1(00,000^2) 정도 범위가 나올거 같고, long을 이용해서 정수형을 사용해야 겠다. 라고 다짐하며 풀이에 들어갔다.
- 문제풀이 전략 :
- 간단하게 문제에서 하라는 대로 하면 될거같다.
- 식을 이용하여 교점을 구하기.
- 정수좌표만 포함하는 교점인지 판단하기.
- min, max 판단해서 크기랑 그림 평행이동 시키기
- 캔버스를 알맞게 그리기.
- 교점에 \*칠하기.
- 문제풀이(Code)
- 본능적인 Point 클래스 만들기.
- 간단하게 문제에서 하라는 대로 하면 될거같다.
- 교점을 구하는 식과, 무조건 교점이 생기고, 같은 직선은 안주는 조금 인심좋은 문제라고 생각하고 가볍게 들어갔디... (물론 이래서 애를 많이 먹었다...)
class Point
{
long x;
long y;
public Point(long x, long y)
{
this.x = x;
this.y = y;
}
}
- 구하라는 대로 구한 Solution 클래스
- 좀 깔끔하게 문제를 풀어야 겠다.. 라고 다짐한 문제이다...
- 사실 체점하기 누르고 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