백준 1018번, 1085번 js

Kimseongeun·2022년 4월 4일
0

백준

목록 보기
1/3
post-thumbnail

백준 1018번

1018번: 체스판 다시 칠하기

//브루트포스-완전탐색
const fs=require('fs');
const readFileSyncAddress='/dev/stdin';
//const readFileSyncAddress='input.txt';

let input=fs.readFileSync(readFileSyncAddress).toString().trim().split('\n');

function solution(input){
    [size, ...arr]=input;
    [row, col]=size.split(' ');
    arr=arr.map(str => str.trim('\r').split(''));
    const answer=[];
    const line=['WBWBWBWB','BWBWBWBW'];

    for(let i=0; i<=row-8; i++){
        for(let j=0; j<= col-8; j++){
            for(let z=0; z<2; z++){
                let count=0;
                for(let x=0; x<8; x++){
                    for(let y=0; y<8; y++){
                        const current=arr[i+x][j+y];
                        if(current !== line[(x+z)%2][y]) count++;
                    }
                }
                answer.push(count);
            }
        }
    }
    return Math.min(...answer);
}

console.log(solution(input));

✅솔루션

line 이라는 배열에 WBWBWB 와 그 반대되는 걸 두개 넣어놓는다.

이것은 화이트로 시작하는 8X8 판, 반대로 검정으로 시작하는 판으로 나눠 생각을 해야한다.

i, j는 박스를 맨 처음 0,0부터 시작해서 아래 그림마냥 하나씩 대보는 것이다.

그래서 row-8, col-8만큼 두고 반복문을 돌린 것이다.

그 후에 그 8x8 안에서 첫 픽셀? 상자부터 검사를 해 나가면서 이게 화이트로 시작하는지 검정으로 시작하는지를 line 배열과 비교해가면서 count를 올렸다.

예를들어 하얀색으로 시작한다 쳤을 땐 행이 짝수이면 모두 하얀색이어야하고 홀수이면 검정이어야할 것이다. 그래서 (x+z)%2 을 행에 넣은 것이다. 그래서 맞게 채워지지 않았으면 그건 우리가 수정해야하는 경의 수이므로 우리가 알고 싶은 결과라서 count를 올리는 것이다. 그렇게 하나씩 8x8을 옮겨가면서 비교한 결과의 count들이 answer의 배열에 들어가 있을테고 그 중 최소값을 구하면 그게 최소한으로 수정하는 경의 수일 것이다.


백준 1085번

1085번: 직사각형에서 탈출

const fs=require('fs');
const readFileSyncAddress='/dev/stdin';

// For local test
const input = fs.readFileSync(readFileSyncAddress).toString().trim().split(' ');
const x = input[0];
const y = input[1];
const w = input[2];
const h = input[3];
const counters = [x, y, w - x, h - y]; //직사각형을 벗어날 수 있는 이동 값

console.log(Math.min.apply(null, counters));

✅솔루션

x,y 에서 직사각형에서 벗어날 방법은 아래 그림만 이해하면 된다! 0,0쪽으로 벗어나려면 x만큼, y만크 벗어나면 되는 것이고 w,h가 오른쪽 맨 위 점이라고 했으니 그림대로 w,h쪽으로 벗어나려면 h-y만큼 위로 벗어날 수 있고, w-x만큼 오른쪽으로 벗어날 수 있다! 그러니 그 경우의 수가 x, y, w-h, h-y가 나오고 여기서 최소값을 구하면 그게 최소 거리로 직사각형을 벗어날 수 있는 수가 되겠다.

profile
김성은입니다.

0개의 댓글