Home 백준 - 01
Post
X

백준 - 01


2563번 - 색종이 (2차원 배열)

  • 입력 첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다.

색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변과 도화지의 왼쪽 변 사이의 거리이고, 두 번째 자연수는 색종이의 아래쪽 변과 도화지의 아래쪽 변 사이의 거리이다.

색종이의 수는 100 이하이며, 색종이가 도화지 밖으로 나가는 경우는 없다.

  • 예제 입력

    1
    2
    3
    4
    
    3
    3 7
    15 7
    5 2
    
  • 출력 첫째 줄에 색종이가 붙은 검은 영역의 넓이를 출력한다.
  • 예제 출력
    1
    
    260;
    

Solution

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// 입력을 2차원 배열로 받아옵니다. (split 두번)
const input = require("fs")
  .readFileSync("dev/stdin")
  .toString()
  .split("\n")
  .map((x) => {
    return x.trim().split(" ").map(Number);
  });

// 생성할 2차원 배열의 크기
let xMax = 0;
let yMax = 0;

for (let i = 1; i <= input[0]; i++) {
  xMax = Math.max(xMax, input[i][0] + 10);
  yMax = Math.max(yMax, input[i][1] + 10);
}

// 2차원 배열 생성 함수
let arr = Array.from(Array(xMax), () => Array(yMax).fill(0));

let answer = 0;

for (let i = 1; i <= input[0]; i++) {
  let x = input[i][0];
  let y = input[i][1];

  for (let j = 0; j < 10; j++) {
    for (let k = 0; k < 10; k++) {
      if (arr[x + j][y + k] !== 0) {
        continue;
      }

      if (arr[x + j][y + k] === 0) {
        arr[x + j][y + k] = 1;

        answer++;
      }
    }
  }
}

console.log(answer);

Array.from()

Array.from() 메서드는 유사 배열 객체(array-like object)나 반복 가능한 객체(iterable object)를 얕게 복사해 새로운Array 객체를 만듭니다.

Array.from(arrayLike[, mapFn[, thisArg]])

  • arrayLike
    배열로 변환하고자 하는 유사 배열 객체나 반복 가능한 객체
  • mapFn
    배열의 모든 요소에 대해 호출할 mapping 함수.
  • thisArg
    mapFn 실행 시에 this로 사용할 값.
  • 반환값
    새로운 Array 인스턴스.
  • 예제

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    // String => Array
    Array.from("foo"); // ["f", "o", "o"]
    
    // Set => Array
    const s = new Set(["foo", window]);
    Array.from(s); // ["foo", window]
    
    // Map => Array
    const m = new Map([
      [1, 2],
      [2, 4],
      [4, 8],
    ]);
    Array.from(m); // [[1, 2], [2, 4], [4, 8]]
    Array.from(mapper.values()); // ['2', '4', '8'];
    Array.from(mapper.keys()); // ['1', '2', '4'];
    
    // 화살표 함수 사용하기
    Array.from([1, 2, 3], (x) => x + x); // [2, 4, 6]
    

10757번 - 큰 수 A+B (일반 수학 1)

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

  • 예제 입력

    1
    
    9223372036854775807 9223372036854775808
    
  • 출력 첫째 줄에 색종이가 붙은 검은 영역의 넓이를 출력한다.
  • 예제 출력
    1
    
    18446744073709551615;
    

Solution

1
2
3
4
5
6
7
const input = require("fs").readFileSync("dev/stdin").toString().split(" ");

const [a, b] = input.map(BigInt);

let answer = a + b;

console.log(answer.toString());

BigInt()

Number 원시 값이 나타낼 수 있는 최대치인 2^53 - 1보다 큰 정수를 표현할 수 있는 내장 객체입니다.

2^53 - 1 는 Number.MAX_SAFE_INTEGER 로 9007199254740991

  • BigInt는 정수 리터럴의 뒤에 n을 붙이거나(10n) 함수 BigInt()를 호출해 생성할 수 있습니다.

    1
    2
    3
    4
    
    const theBiggestInt = 9007199254740991n;
    
    const alsoHuge = BigInt(9007199254740991);
    // ↪ 9007199254740991n
    
  • BigInt를 바로 출력하면 끝에 n이 붙어서 나오기 때문에 toString()으로 출력합니다.

    1
    2
    3
    4
    5
    
    console.log(answer);
    // 18446744073709551615n
    
    console.log(answer.toString());
    // 18446744073709551615
    
  • Array의 내장함수인 sort함수를 BigInt가 담긴 배열에 사용했을 때 잘못된 결과를 도출할 수 있다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    const arr = [-3n, -5n, -9n, 6n, 10n];
    
    arr.sort();
    
    console.log(arr);
    // [ -3n, -5n, -9n, 10n, 6n ]
    
    const mixed = [4n, 6, -12n, 10, 4, 0, 0n];
    
    mixed.sort();
    
    console.log(mixed);
    // [-12n, 0, 0n, 10, 4n, 4, 6]
    
  • 소수점 결과를 포함하는 연산을 BigInt와 사용하면 소수점 이하는 사라진다.

    1
    2
    3
    4
    5
    
    const expected = 4n / 2n;
    // 2n
    
    const rounded = 5n / 2n;
    // 2n
    
  • Number 와 함께 연산할 수 없고, BigInt끼리만 연산할 수 있습니다.
  • Math 객체의 min, max, abs 등 메서드를 사용할 수 없습니다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.