Algorithm Problem Solving/Programmers

[프로그래머스] 위클리 챌린지 교점에 별 만들기 with Swift

코코자장자장 2022. 2. 10. 15:00

안녕하세요. 오늘은 프로그래머스 교점에 별 만들기를 풀어보도록 하겠습니다.

 

코딩테스트 연습 - 교점에 별 만들기

[[2, -1, 4], [-2, -1, 4], [0, -1, 1], [5, -8, -12], [5, 8, 12]] ["....*....", ".........", ".........", "*.......*", ".........", ".........", ".........", ".........", "*.......*"] [[0, 1, -1], [1, 0, -1], [1, 0, 1]] ["*.*"] [[1, -1, 0], [2, -1, 0], [4, -

programmers.co.kr

 

이 문제는 참고 사항에 문제 해결방법이 대부분 나와있습니다.

 

Ax + By + E = 0
Cx + Dy + F = 0
두 직선의 교점이 유일하게 존재할 경우, 그 교점은 다음과 같습니다.

또, AD - BC = 0인 경우 두 직선은 평행 또는 일치합니다.

 

위에서 주어진 참고사항을 활용하여 정수인 점들을 미리 정해줍니다.

정수인지 확인하기위해서 Int로 바꾸고 다시 Double로 형변환 했을때 원래 값과 같으면 정수로 하였습니다!

for i in 0..<line.count-1 {
    let A = line[i][0]
    let B = line[i][1]
    let E = line[i][2]
    for j in i+1..<line.count {
        let C = line[j][0]
        let D = line[j][1]
        let F = line[j][2]
        if A * D - B * C == 0 {
            continue
        }
        let X:Double = Double(B * F - E * D) / Double(A * D - B * C) 
        let Y:Double = Double(E * C - A * F) / Double(A * D - B * C)
        let intX:Int = Int(X)
        let intY:Int = Int(Y)
        if X != Double(intX) || Y != Double(intY) {
           continue
        }
        if minX > intX {
            minX = intX
        }
        if maxX < intX {
            maxX = intX
        }
        if minY > intY {
            minY = intY
        }
        if maxY < intY {
            maxY = intY
        }
        
        points.append([intX, intY])
    }
}

 

그리고 min, max를 이용해 출력할 문자열배열을 만들어줍니다.

var answers:[[String]] = [[String]](repeating: [String](repeating: ".",
                                                        count: maxX - minX + 1), 
                                    count: maxY - minY + 1)

 

그리고 별을 찍어주고 String배열에 정리해서 넣어주고 반환해주시면 문제가 해결됩니다.

 

import Foundation

func solution(_ line:[[Int]]) -> [String] {
    var points:[[Int]] = [[Int]]()
    var minX = Int.max
    var maxX = Int.min
    var minY = Int.max
    var maxY = Int.min

    for i in 0..<line.count-1 {
        let A = line[i][0]
        let B = line[i][1]
        let E = line[i][2]
        for j in i+1..<line.count {
            let C = line[j][0]
            let D = line[j][1]
            let F = line[j][2]
            if A * D - B * C == 0 {
                continue
            }
            let X:Double = Double(B * F - E * D) / Double(A * D - B * C) 
            let Y:Double = Double(E * C - A * F) / Double(A * D - B * C)
            let intX:Int = Int(X)
            let intY:Int = Int(Y)
            if X != Double(intX) || Y != Double(intY) {
                continue
            }
            if minX > intX {
                minX = intX
            }
            if maxX < intX {
                maxX = intX
            }
            if minY > intY {
                minY = intY
            }
            if maxY < intY {
                maxY = intY
            }
            
            points.append([intX, intY])
        }
    }

    var answers:[[String]] = [[String]](repeating: [String](repeating: ".", 
                                                            count: maxX - minX + 1), 
                                        count: maxY - minY + 1)

    for i in points {
        answers[i[1]-minY][i[0]-minX] = "*"
    }

    var result: [String] = []
    for answer in answers.reversed() {
        result.append(answer.reduce("", { (s1: String, s2: String) -> String in
                                         return s1 + s2
                                        }
                                   )
                     )
    }

    return result
}

오늘은 여기까지입니다!

 

질문이 있으시면 댓글로 남겨주세요!

 

감사합니다!