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

    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
    반응형

    댓글