Four Boxes

4개의 직사각형이 평면에 있는데 밑변이 모두 가로축에 평행하다. 이 직사각형들이 차지하는 면적을 구하는 프로그램을 작성하시오. 이 네 개의 직사각형들은 서로 떨어져 있을 수도 있고 겹쳐 있을 수도 있다. 또한 하나가 다른 하나를 포함할 수도 있으며, 변이나 꼭지점이 겹쳐질 수도 있다.

입력형식

하나의 직사각형은 왼쪽 아래의 꼭지점과 오른쪽 위의 꼭지점의 좌표로 주어진다. 입력은 네 줄이며, 각 줄은 네 개의 정수로 하나의 직사각형을 나타낸다. 첫 번째와 두 번째의 정수는 사각형의 왼쪽 아래 꼭지점의 x좌표, y좌표이고, 세 번째와 네 번째의 정수는 사각형의 오른쪽 위 꼭지점의 x좌표, y좌표이다. 단, x좌표와 y좌표는 1 이상이고 1000 이하인 정수이다.

출력형식

화면에 4개의 직사각형이 차지하는 면적을 출력한다.

입력예제

1 2 4 4
2 3 5 7
3 1 6 5
7 3 8 6

출력예제

26

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

26개의 풀이가 있습니다. 2 / 3 Page

python3입니다. set에 좌표들을 다 때려박고 원소 갯수를 셌습니다.

locs = set()
def sol(tc):
    for (lx, ly, rx, ry) in tc:
        for i in range(lx, rx):
            for j in range(ly, ry):
                locs.add((i, j))
    return len(locs)

tc = [(1, 2, 4, 4), (2, 3, 5, 7), (3, 1, 6, 5), (7, 3, 8, 6)]
print(sol(tc))
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def fill_plane(plane, coordinate):
    for x in range(coordinate[0],coordinate[2]):
        for y in range(coordinate[1],coordinate[3]):
            plane[y][x] = 1


if __name__ == '__main__':
    Plane = [[0]*1000 for x in range(1000)]

    for x in range(4):
        coordinate = input("Enter the data of #%d square:  " % (x+1))
        coordinate = [int(c) for c in coordinate.split()]
        fill_plane(Plane,coordinate)

    Area = sum([sum(x) for x in Plane])
    print('총 면적:  %d' % Area)

파이썬 3.0입니다. 평면을 만들어놓고, 사각형을 1로 색칠한 후, 그 값을 더하는 방식을 사용했습니다.

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
from itertools import product
co = [[int(x) for x in raw_input().split()] for y in range(4)]
print len(reduce(lambda x,y:x|y,[{p for p in product( range(x1,x2),range(y1,y2) )} 
            for (x1,y1,x2,y2) in co]))

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

Python으로 작성했습니다. 면적에 해당하는 좌표를 리스트에 집어넣고 중복되는 영역은 무시하고 리스트 원소의 갯수를 센다.

def getArea(rects):
    pointList = set()
    for rect in rects:
        for x in range(rect[0], rect[2]):
            for y in range(rect[1], rect[3]
        pointList.add((x,y))
    return len(pointList)

rects=[]
print("Input rectangle 4 points or enter for quit")
while True:
    v = input()
    if v == "":
        break
    else:
        rects.append([int(x) for x in v.split(" ")])
print("area : %d" % getArea(rects))

결과

Input rectangle 4 points or enter for quit
1 2 4 4
2 3 5 7
3 1 6 5
7 3 8 6

area : 26
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
sample = '''1 2 4 4
2 3 5 7
3 1 6 5
7 3 8 6'''

def place(li, co):
    lx, ly, rx, ry = co
    for x in range(lx, rx):
        for y in range(ly, ry):
            li[x][y] = 1

if __name__ == '__main__':
    ra = list((list((int(y) for y in x.split())) for x in (sample.split('\n'))))
    h = max(max(x) for x in ra)
    area = list((list((0 for y in range(h+1))) for x in range(h+1)))
    for x in ra:
        place(area, x)
    print(sum((x.count(1))for x in area))


파이썬 3.5.1 입니다. 답은 26.

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

Ruby

tiles = ->rect { x1,y1,x2,y2 = rect; [*x1...x2].product [*y1...y2] }
area = ->rects { rects.sum([], &tiles).uniq.size }

or

rects.flat_map {|x1,y1,x2,y2|[*x1...x2].product [*y1...y2]}.uniq.size #=>26

Test

rects = [[1,2,4,4],[2,3,5,7],[3,1,6,5],[7,3,8,6]]
expect(area[rects]).to eq 26
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

4개의 사각형을 모두 둘러싸는 최소의 사각형을 구해 그 넓이를 구하고, 사각형의 모든 좌표는 정수값이라는 점에 착안, 둘러싼 영역의 각 좌표 x, y에 대해 x + 0.5, y + 0.5 가 A, B, C, D 사각형의 어느 것에도 속해있지 않다면, 전체 넓이에서 1씩 빼서 답을 구합니다.

inputs = []
for _ in range(4):
    ax, ay, bx, by = [int(x) for x in input().split()[:4]]
    inputs.append(((ax, ay), (bx, by)))

# get sx, sy ~ ex, ey
sx = min([x[0] for (x, _) in inputs])
sy = min([x[1] for (x, _) in inputs])
ex = max([x[0] for (_, x) in inputs])
ey = max([x[1] for (_, x) in inputs])

def hasPoint(a, b, px, py):
    ax, ay = a
    bx, by = b
    return ax < px + 0.5 < bx and ay < py + 0.5 < by

for x in range(sx, ex):
    for y in range(sy, ey):
        for a, b in inputs:
            if hasPoint(a, b, x, y):
                break
        else:
            s -= 1
print(s)
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

파이썬 3.4.2

matr = set()
lis = []
for i in range(4):
    lis.append(tuple(map(int,input().split())))
for p in lis:
    x1 = p[0]
    y1 = p[1]
    x2 = p[2]
    y2 = p[3]
    for x in range(x1,x2):
        for y in range(y1,y2):
            matr.add((x,y)) # (x,y)는 (x,y)부터 (x+1,y+1)까지의 정사각형을 나타냅니다 똑같은 것이 집합에서는 하나로 취급되어 중복되는 것은 없어진다.
print(len(matr))
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
a=[]
coll=[]
roww=[]
l=0
for i in range(4):
    a.append(input().split(" "))
for i in range(4):
    coll.append(int(a[i][0]))
    coll.append(int(a[i][2]))
    roww.append(int(a[i][1]))
    roww.append(int(a[i][3]))
coll.sort()
roww.sort()

summ=[[0 for row in range(roww[-1])] for col in range(coll[-1])]
for k in range(4):
    for i in range(int(a[k][0]),int(a[k][2])):
        for j in range(int(a[k][1]),int(a[k][3])):
            summ[i][j]=1

for i in range(coll[-1]):
    for j in range(roww[-1]):
        l=l+summ[i][j]

print(l)
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

PHP로 짜봤습니다.

$input = array();
$input[] = array(1,2,4,4);
$input[] = array(2,3,5,7);
$input[] = array(3,1,6,5);
$input[] = array(7,3,8,6);

$area = array(array());
$sum = 0;
foreach($input as $in) {
    for($i=$in[0]; $i<$in[2]; $i++) {
        for($j=$in[1]; $j<$in[3]; $j++) {
            if(!isset($area[$i][$j])) {
                $area[$i][$j] = true;
                $sum++;
            }
        }
    }
}
echo $sum;
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

풀이 작성

※ 풀이작성 안내
  • 본문에 코드를 삽입할 경우 에디터 우측 상단의 "코드삽입" 버튼을 이용 해 주세요.
  • 마크다운 문법으로 본문을 작성 해 주세요.
  • 풀이를 읽는 사람들을 위하여 풀이에 대한 설명도 부탁드려요. (아이디어나 사용한 알고리즘 또는 참고한 자료등)
  • 작성한 풀이는 다른 사람(빨간띠 이상)에 의해서 내용이 개선될 수 있습니다.
목록으로
코딩도장

코딩도장은 프로그래밍 문제풀이를 통해서 코딩 실력을 수련(Practice)하는 곳입니다.


언어별 풀이 현황
전 체 x 26
java x 2
기 타 x 3
python x 12
delphi x 1
perl x 1
cpp x 2
r x 1
go x 1
cs x 1
php x 1
ruby x 1