밝을희 클태

[백준 node.js / javascript] 폴리오미노(1342)문제 본문

백준

[백준 node.js / javascript] 폴리오미노(1342)문제

huipark 2023. 10. 29. 21:58

문제:

민식이는 다음과 같은 폴리오미노 2개를 무한개만큼 가지고 있다. AAAA와 BB

이제 '.'와 'X'로 이루어진 보드판이 주어졌을 때, 민식이는 겹침 없이 'X'를 모두 폴리오미노로 덮으려고 한다. 이때, '.'는 폴리오미노로 덮으면 안 된다.

폴리오미노로 모두 덮은 보드판을 출력하는 프로그램을 작성하시오.

출력:

첫째 줄에 사전순으로 가장 앞서는 답을 출력한다. 만약 덮을 수 없으면 -1을 출력한다.


코드:

const fs = require("fs");
let map = fs.readFileSync("/dev/stdin").toString().trim();
let answer = "";

const check = (idx, notEnb) => {
	if (idx % 4 === 0) while (idx--) answer += "A";
	else if (idx % 2 === 0)
		while (idx) {
			if (idx <= 2) answer += "B";
			else answer += "A";
			--idx;
		}
	else {
		console.log(-1);
		process.exit();
	}
	if (notEnd) answer += ".";
};

while (1) {
	let idx = map.indexOf(".", 0);
	if (idx !== -1) check(idx, true);
	else if (idx === -1) {
		check(map.length, false);
		break;
	}
	map = map.substring(idx + 1);
	i = 0;
}
console.log(answer);

 

코드설명:

문자열중에 '.'문자를 찾고 인덱스를 idx변수에 저장하고 idx가 -1이라는 건 문자열중에 '.'문자가 없는 거기 때문에 반복문을 종료하고 아니면 check함수로 idx와 문자열이 끝인지 아닌지를 bool형식으로 전달해 준다.

while (1) {
	let idx = map.indexOf(".", 0);
	if (idx !== -1) check(idx, true);
	else if (idx === -1) {
		check(map.length, false);
		break;
	}
	map = map.substring(idx + 1);
	i = 0;
}

 

문제에서 우선시 되는 값이 "AAAA"이기 때문에 먼저 "AAAA"가 들어갈 자리가 있는지 검사해 주고 그다음 "BB"의 자리를 검사해 준다. 여기서 위의 두 사항에 걸리지 않으면 정상적이지 않은 문자열이 들어온 거기 때문에 -1을 출력해 주고 프로세스를 종료시켜 준다.

정상적인 상황이면 "AAAA", "BB"를 순차적으로 answer문자열에 넣어준 다음 notEnd 변수를 통해서 문자열의 끝인지 아닌지를 판단해서 상화에 맞게 "."을 answer에 넣어준다.

const check = (idx, notEnb) => {
	if (idx % 4 === 0) while (idx--) answer += "A";
	else if (idx % 2 === 0)
		while (idx) {
			if (idx <= 2) answer += "B";
			else answer += "A";
			--idx;
		}
	else {
		console.log(-1);
		process.exit();
	}
	if (notEnd) answer += ".";
};

 

그리고 다시 반복문으로 돌아와서 위에서 찾은 idx의 다음 idx로 문자열을 새로 할당해 주고, 문자열이 끝날 때까지 반복문을 돈다.

	map = map.substring(idx + 1);