안녕하세요. 오늘은 프로그래머스 교점에 별 만들기를 풀어보도록 하겠습니다.
이 문제는 참고 사항에 문제 해결방법이 대부분 나와있습니다.
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
}
오늘은 여기까지입니다!
질문이 있으시면 댓글로 남겨주세요!
감사합니다!
'Algorithm Problem Solving > Programmers' 카테고리의 다른 글
[프로그래머스] 2018 KAKAO BLIND RECRUITMENT [1차] 캐시 with Swift (0) | 2022.03.03 |
---|---|
[프로그래머스] 위클리 챌린지 전력망을 둘로 나누기 with Swift (0) | 2022.02.12 |
[프로그래머스] Summer/Winter Coding(~2018) 영어 끝말잇기 with Swift (0) | 2022.02.04 |
[프로그래머스] 월간 코드 챌린지 시즌1 삼각 달팽이 with Swift (0) | 2022.01.29 |
[프로그래머스] 월간 코드 챌린지 시즌2 2개 이하로 다른 비트 with Swift (0) | 2022.01.28 |