본문 바로가기
백준 & 프로그래머스

프로그래머스.교점에 별 만들기.Java and Python

by concho 2024. 1. 15.

 


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

댓글