Leetcode 를 풀어 보았다.

a-paka·2022년 2월 20일
0

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)))
    }
}

profile
iOS Engineer

0개의 댓글