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 등 메서드를 사용할 수 없습니다.