Pick One 버튼을 눌러 랜덤으로 한 문제를 뽑았다.
1527. Patients With a Condition
이런.. SQL 문제가 뽑혔다. 다시 돌렸다.
223. Rectangle Area
그림과 예시를 먼저 봤다.
직사각형 2개를 주고 면적의 총 합을 구하는 문제였다.
겹치는 부분을 한 번 빼주면 될 거 같은데, 겹치는 좌표를 어떻게 구한담?
생각해보니 겹치는 좌표의 x, y 는 주어진 x, y 중 하나를 꼭 따라가게 되어있다.
코드 작성을 시작해 보았다. 우선 풀이를 쉽게 해주는 좌표 스트럭트와 좌표 2개로 면적을 리턴하는 메소드를 생성했다.
struct P {
var x: Int
var y: Int
init(_ x: Int, _ y: Int) {
self.x = x
self.y = y
}
}
func area(_ p: P, _ q: P) -> Int {
(q.x - p.x) * (q.y - p.y)
}
잘 동작 하려나? p == q 인 경우에 0.. 머리 속으로 대충 돌려보니 맞는거 같다.
생각해보니 겹치는 좌표가 생기려면 변이 서로 겹쳐야 된다.
var overlapped = 0
if max(ax1, bx1) < min(ax2, bx2), max(ay1, by1) < min(ay2, by2) {
overlapped = area(P(max(ax1, bx1), max(ay1, by1)), P(min(ax2, bx2), min(ay2, by2)))
}
그런데 area 함수에서 예외처리하면 if statement 를 없앨 수 있을 것 같다.
답:
class Solution {
func computeArea(_ ax1: Int, _ ay1: Int, _ ax2: Int, _ ay2: Int, _ bx1: Int, _ by1: Int, _ bx2: Int, _ by2: Int) -> Int {
struct P {
var x: Int
var y: Int
init(_ x: Int, _ y: Int) {
self.x = x
self.y = y
}
}
func area(_ p: P, _ q: P) -> Int {
max(q.x - p.x, 0) * max(q.y - p.y, 0)
}
return
area(P(ax1, ay1), P(ax2, ay2)) +
area(P(bx1, by1), P(bx2, by2)) -
area(P(max(ax1, bx1), max(ay1, by1)), P(min(ax2, bx2), min(ay2, by2)))
}
}