Problem
Solution
ํด๋น ๋ฌธ์ ์ ํต์ฌ์ ๋ ์ง์ (๋ฐฉ์ ์)์ ๊ต์ ์ ์ฐพ๋ ๋ฐฉ๋ฒ์ ์๋ ๊ฒ์ ๋๋ค.
์๋ ๋ ์ง์ ์ด ์๋ค๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
1. ax + by + c
2. dx + ey + f
๊ต์ ์ ์ฐพ๋ ์์ ์๋์ ๊ฐ์ต๋๋ค.
x = (bf - ed) / (ad - bc)
y = (ec - af) / (ad - bc)
์ฌ๊ธฐ์ ad - bc๊ฐ ๋ง์ฝ 0์ด๋ผ๋ฉด ๋ ์ง์ ์ ํํํ๋ค๋ ์๋ฏธ์ ๋๋ค.
์ ๋ฐฉ์๋๋ก ๋ชจ๋ ์ง์ ์ ๊ต์ ์ ์ฐพ์ผ๋ฉฐ x์ ๊ฐ์ฅ ํฐ ๊ฐ๊ณผ ์์ ๊ฐ, y์ ๊ฐ์ฅ ํฐ ๊ฐ๊ณผ ์์ ๊ฐ์ ์ฐพ์ ์ต์ ์ฌ๊ฐํ์ ๋ฒ์๋ฅผ ์ ํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก ๋ฒ์ ์์์ ๊ต์ ์ ์์น๋ฅผ ๋ณ๋ก ๋ฐ๊ฟ์ค ๋ค ๋ฐํํฉ๋๋ค.
์ฝ๋ ํด์ค
๊ต์ ,์ต์ ์ฌ๊ฐํ,์ง์ ์ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ง๋ค์ด์ค๋๋ค.
struct Line {
let x:Int,y:Int,c:Int
}
struct Square {
var minX:Int = Int.max
var maxX:Int = -Int.max
var minY:Int = Int.max
var maxY:Int = -Int.max
}
struct Meet {
let x:Int,y:Int
}
1. ๊ต์ ์ ์ฐพ๋๋ค.
์์์ ๊ต์ ์ ๊ตฌํ๋ ์์ผ๋ก ๋ ์ง์ ์ ๊ต์ ์ ๊ตฌํด์ค๋๋ค.
๋ค๋ง ๋ฌธ์ ์์ x์ y ๋ชจ๋ ์ ์์ธ ๊ต์ ๋ง ํ์ํ๋ฏ๋ก ์ ์๊ฐ ์๋ ๊ฒ์ nil๋ก ๋ฐํํฉ๋๋ค.
func findMeet(_ l1:Line,_ l2:Line) -> Meet? {
let adbc = l1.x*l2.y - l1.y*l2.x
if adbc == 0 { return nil }
let bfed = l1.y*l2.c - l1.c*l2.y
let ecaf = l1.c*l2.x - l1.x*l2.c
let meet = Meet(x:bfed/adbc, y:ecaf/adbc)
return bfed % adbc == 0 && ecaf % adbc == 0 ? meet : nil
}
2. ๋ชจ๋ ์ง์ ์ ๊ต์ ์ ๊ตฌํ๋ค.
๋ชจ๋ ์ง์ ์ ๊ต์ ์ ์ฐพ์ ์ ์ฅํฉ๋๋ค.
func getIntegerMeet(lines:[[Int]]) -> [Meet] {
var lines:[[Int]] = lines
var meets:[Meet] = []
while !lines.isEmpty {
let first = lines.removeFirst()
let firstLine = Line(x:first[0], y:first[1], c: first[2])
for l in lines {
let otherLine = Line(x: l[0], y: l[1], c: l[2])
if let meet = findMeet(firstLine,otherLine) {
meets.append(meet)
}
}
}
return meets
}
3. ๋ชจ๋ ๊ต์ ๋ค์ ์ด์ฉํด ์ต์ ์ฌ๊ฐํ์ ๋ฒ์๋ฅผ ์ ํ๋ค.
func getSquare(meets:[Meet]) -> Square {
var square:Square = Square()
meets.forEach {
square.minX = min(square.minX,$0.x)
square.maxX = max(square.maxX,$0.x)
square.minY = min(square.minY,$0.y)
square.maxY = max(square.maxY,$0.y)
}
return square
}
4. ์ต์ ์ฌ๊ฐํ์ ๊ต์ ์ ๋ณ๋ก ๋ฐ๊ฟ์ค๋ค.
x์ ์ต๋๊ฐ - ์ต์๊ฐ + 1๋งํผ์ ๋ฐฐ์ด์ y์ ์ต๋๊ฐ - ์ต์๊ฐ + 1๋งํผ ๋ง๋ค์ด์ค๋๋ค.
๊ทธ ๋ค์ ๊ต์ ๋ค์ ํ์ธํ๋ฉด์ ๋ณ๋ก ๋ฐ๊ฟ์ค๋๋ค.
์ฃผ์ํ์ค ์ ์ ์ขํ์์ y๊ฐ์ ์๋ก ๊ฐ์๋ก ์ปค์ง๊ธฐ ๋๋ฌธ์ ์ต๋๊ฐ์์ ํ์ฌ y๊ฐ์ ๋นผ์ค๋๋ค.
func changeMeetsToStar(meets:[Meet],square:Square) -> [String] {
var sqaureDot = Array(repeating: Array(repeating: ".", count: square.maxX-square.minX+1), count: square.maxY-square.minY+1)
for meet in meets {
let x = meet.x - square.minX
let y = square.maxY - meet.y
sqaureDot[y][x] = "*"
}
return sqaureDot.map{$0.joined()}
}
5. ๋ณ๋ก ๋ฐ๊พผ ์ฌ๊ฐํ์ ๋ฐํํ๋ค.
func solution(_ line:[[Int]]) -> [String] {
let meets:[Meet] = getIntegerMeet(lines:line)
let square = getSquare(meets: meets)
return changeMeetsToStar(meets: meets, square: square)
}
Source Code
๋๊ธ