코딩 테스트

[백준] 2563번 - 색종이 (node.js)

JJIMJJIM 2024. 4. 23. 13:14
728x90
반응형

 

 

 

반응형

 

 

[백준] 2563번 - 색종이  (node.js)

솔직히 문제를 보자마자 ㄷㄷㄷ했었다가,

좀 생각을 해보니 충분히 풀 수 있는 문제라고 생각했습니다.

중복되는 너비를 찾아서 전체너비에서 빼면 될거라 생각하여,

재귀함수를 만들어서 중복되는 부분을 찾아보려고 시도했다가 이 방식이 아닌것 같아서

후퇴했다가.. 포기하고 다른분들의 답안지를 보았습니다.

그런데 역시나 제 방향성이 달랐던거 같더라구요.

이 문제도 2차원 배열로 푸는 문제였습니다...;;

전체 도화지 크기 즉 100 * 100의 2차 배열을 구하고,

거기에서 색종이의 너비를 점으로 표시하듯해서 구하게되면 중복없이

너비를 구할 수 있었습니다. 

하.. 똑똑한 사람 참 많다!

 

 

 

 

문제

가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록 붙인다. 이러한 방식으로 색종이를 한 장 또는 여러 장 붙인 후 색종이가 붙은 검은 영역의 넓이를 구하는 프로그램을 작성하시오.

예를 들어 흰색 도화지 위에 세 장의 검은색 색종이를 그림과 같은 모양으로 붙였다면 검은색 영역의 넓이는 260이 된다.

 

 

 

입력

 

첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변과 도화지의 왼쪽 변 사이의 거리이고, 두 번째 자연수는 색종이의 아래쪽 변과 도화지의 아래쪽 변 사이의 거리이다. 색종이의 수는 100 이하이며, 색종이가 도화지 밖으로 나가는 경우는 없다

 

 

 

출력

 

첫째 줄에 색종이가 붙은 검은 영역의 넓이를 출력한다.

 

 

 

 

 

 

 

 

 

문제풀이

위에서 미리 언급했었지만

이 색종이 문제도 2차원 배열로 푸는 문제였습니다.

세로, 가로 길이를 구해서 너비를 구하는 식이 아니라,

도화지를 100 * 100인 2차원 배열로 보고 그안에 색종이의 크기만큼 점을 찍듯 표시하고

해당 넓이를 구하는 문제였습니다.

 

const fs = require("fs");
const [cnt, ...arr] = fs
    .readFileSync("input.txt")
    .toString()
    .trim()
    .split(/\r?\n/);
    
    
    const solution = () => {
    	const tatalArr = Array.from({length: 100}, () => Array(100).fill(0)); // 도화지 전체크기
        const numArr = arr.map(d => d.split(' ').map(v => parseInt(v))); // 색종이 정보
        let result = 0
        
        for (let i = 0; i < cnt; i++) { // 색종이 갯수만큼 루프 돌리고
        	const row = numArr[i][0]; // 각각 색종이 정보에서 첫 점 정보를 가져온다. 1
            const cell = numArr[i][1]; // 각각 색종이 정보에서 첫 점 정보를 가져온다. 2
        	for (let j = row; j < row + 10; j++) { // 그 점들을 도화지에다가 너비만큼 찍는다 (10 * 10)
            	for (let k = cell; k < cell + 10; k++) {
                	if (tatalArr[j][k]) continue; // 이미 찍은 부분은 넘어가고
                    tatalArr[j][k]++; // 안직은 부분만 1을 추가해주면 중복 피할 수 있다.
                    // result++; // 여기서 바로 result도 같이 더해줘서 답을 구할 수 도 있고.
                }
            }
        }
        
        for (let i = 0; i < 100; i++) {
        	for (let j = 0; j< 100; j++) {
            	if (tatalArr[i][j]) result++; // 이런식으로 채워진 도화지에서 구할 수도 있다.
            }
        }
    }
    
    solution();

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

참조!

https://ggcoding.tistory.com/123

 

[JS] 백준 2563 색종이

https://www.acmicpc.net/problem/2563 2563번: 색종이 가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를

ggcoding.tistory.com

 

728x90
반응형