Java 코드1.
public String[] solution(int[][] line){
List<Long[]> starIdxList = new ArrayList<Long[]>();
long maxX = Long.MIN_VALUE, maxY = -Long.MIN_VALUE, minX = Long.MAX_VALUE, minY = Long.MAX_VALUE;
// 중복없이 2eq뽑기
for(int i = 0; i < line.length-1; i++){
int A = line[i][0], B = line[i][1], E = line[i][2];
for(int j = i+1; j < line.length; j++){
int C = line[j][0], D = line[j][1], F = line[j][2];
// 평행이 아닐때
if(A*D != B*C){
// 정답은 1,000 * 1,000 크기 이내에서 표현됩니다.(중요)
// 교점간의 상대 거리가 1,000,000 이하
long upVarX = ((long)B*(long)F - (long)E*(long)D);
long upVarY = ((long)E*(long)C - (long)A*(long)F);
long down = ((long)A*(long)D - (long)B*(long)C);
// x,y 둘다 정수면
if(upVarX % down == 0 && upVarY % down == 0){
long x = upVarX/down, y = upVarY/down;
if(maxX < x) maxX = x;
if(minX > x) minX = x;
if(maxY < y) maxY = y;
if(minY > y) minY = y;
starIdxList.add(new Long[] {y,x});
}
}
}
}
// List<cahr[]>를 . 으로 초기화 한 후 좌표 위치에 * 찍기
// 교점간의 상대 거리가 1,000,000 이하이므로
// max - min + 1 연산의 결과도 1,000,000이하
// 마찬가지로 starIdx[0] - minY, minX도 1,000,000이하
List<char[]> starMapList = new ArrayList<char[]>();
char[] tmMap = new char[(int)(maxX - minX + 1)];
Arrays.fill(tmMap, '.');
for(int i = 0; i < maxY - minY + 1; i++)
starMapList.add(Arrays.copyOf(tmMap, tmMap.length));
for(Long[] starIdx : starIdxList)
starMapList.get((int)(starIdx[0] - minY))[(int)(starIdx[1]- minX)] = '*';
// 정답 String[] 형태로 변환
int answerIdx = starMapList.size();
String[] answer = new String[answerIdx];
for(char[] starArr : starMapList){
answer[answerIdx-1] = new String(starArr);
answerIdx--;
}
return answer;
}
2. 파이썬 코드
# 파이썬은 숫자 커도 상관 없어서 너무 좋음!
def solution(line):
answer, starSet = [], set()
# 중복을 제외하고 순서 없이 뽑기
for i, eq1 in enumerate(line):
for j in range(i+1,len(line)):
A,B,E = eq1
C,D,F = line[j]
# 주어진 식으로 교점 구하기
upX, down, upY = (B*F - E*D), (A*D - B*C), (E*C - A*F)
if A*D != B*C and upX % down == 0 and upY % down == 0:
y, x = upY//down, upX//down
starSet.add((y, x))
# 좌표 영역 구하기
yMax, yMin = max(starSet, key= lambda x:x[0])[0], min(starSet, key= lambda x:x[0])[0]
xMax, xMin = max(starSet, key= lambda x:x[1])[1], min(starSet, key= lambda x:x[1])[1]
# 별 찍기, 한라인씩 찍기
for i in range(yMax - yMin, -1 , -1):
oneLine = []
for j in range(xMax - xMin + 1):
oneLine.append('*' if (i+ yMin, j+ xMin) in starSet else '.')
answer.append(''.join(oneLine))
return answer
'백준 & 프로그래머스' 카테고리의 다른 글
프로그래머스. 둘만의 암호. Java and Python (0) | 2024.01.26 |
---|---|
프로그래머스. 완주하지 못한 선수. Java and Python (0) | 2024.01.26 |
프로그래머스[2024 KAKAO WINTER INTERNSHIP]가장 많이 받은 선물.Java and Python (0) | 2024.01.10 |
뒤에 있는 큰 수 찾기 (0) | 2023.12.19 |
프로그래머스.호텔 대실.python (0) | 2023.12.17 |
댓글