개발 공부 기록

나는 무엇을 하는가?

알고리즘 문제 풀이

[백준 2669번] 직사각형 네개의 합집합의 면적 구하기 - python, js

진!!!!! 2024. 12. 30. 23:31

https://www.acmicpc.net/problem/2669

 

💡문제 분석 요약

평면에 네 개의 직사각형이 놓여 있는데 그 밑변은 모두 가로축에 평행하다. 이 네 개의 직사각형들은 서로 떨어져 있을 수도 있고, 겹쳐 있을 수도 있고, 하나가 다른 하나를 포함할 수도 있으며, 변이나 꼭짓점이 겹칠 수도 있다.

이 직사각형들이 차지하는 면적을 구하는 프로그램을 작성하시오.

입력

입력은 네 줄이며, 각 줄은 직사각형의 위치를 나타내는 네 개의 정수로 주어진다. 첫 번째와 두 번째의 정수는 사각형의 왼쪽 아래 꼭짓점의 x좌표, y좌표이고 세 번째와 네 번째의 정수는 사각형의 오른쪽 위 꼭짓점의 x좌표, y좌표이다. 모든 x좌표와 y좌표는 1이상이고 100이하인 정수이다.

출력

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

예제 입력 1

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

예제 출력 1

26

💡알고리즘 설계

1. 모든 좌표는 1이상 100이하 이므로, 크기가 101이며 모든 칸의 값이 0인 정사각형 배열을 만든다.

2. 정사각형의 위치를 입력받는다.

3. 전체 배열에서 정사각형이 위치한 부분의 값을 1로 바꾼다

4. 전체 배열의 sum을 구한다.

💡코드

javascript

// Run by Node.js
const readline = require("readline");

(async () => {
  let rl = readline.createInterface({ input: process.stdin });
  const lines = [];
  let counter = 4;
  for await (const line of rl) {
    lines.push(line.split(" ").map(Number));
    counter--;
    if (counter == 0) rl.close();
  }
  let matrix = new Array(101).fill(0).map(() => new Array(101).fill(0));

  for (const [startX, startY, endX, endY] of lines) {
    for (let i = startX; i < endX; i++) {
      for (let j = startY; j < endY; j++) {
        matrix[j][i] = 1;
      }
    }
  }

  let sum = 0;
  matrix.forEach((row) => {
    const rowSum = row.reduce((acc, cur) => {
      return acc + cur;
    }, 0);
    sum += rowSum;
  });

  console.log(sum);

})();

 

python

lines=[]
for _ in range(4):
    lines.append(list(map(int, input().split())))

matrix=[[0 for _ in range(0, 101)] for _ in range(0, 101)]

for startX, startY, endX, endY in lines:
    for i in range(startX, endX):
        for j in range(startY, endY):
            matrix[j][i] = 1

answer=0
for line in matrix:
    answer+=sum(line)

print(answer)

 

💡 느낀점 or 기억할 정보

javascript

let rows = 3; // 행의 개수 let cols = 3; // 열의 개수

let matrix = new Array(rows).fill(0).map(() => new Array(cols).fill(0));

let matrix = Array.from({ length: rows }, () => Array(cols).fill(0));

 

같은 문제를 js로도 풀어보고, python으로도 풀어보았는데 확실히 python이 쉬운 것 같다.

js는 map, from 등 유용하지만 복잡한 문법이 많아 연습을 해야할 것 같다 ^^