[백준] 1343 폴리오미노 JavaScript

·2024년 4월 11일

문제

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

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

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

입력

첫째 줄에 보드판이 주어진다. 보드판의 크기는 최대 50이다.

출력

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

예제 입력

XXXXXX

예제 출력

AAAABB

내가 했던 풀이 방법

  1. 보드판을 한글자씩 검사하면서 "."일 경우 answer에 "."을 더해주고, i를 1 증가시켜준다. (i를 for문에서 증가시키지 않는 이유는 "."이 아닐 경우, "."이 나올 때까지 i를 증가시켜주기 때문이다. (2번))
  2. "."이 아닐 경우, "."가 나올 때까지 n과 i를 증가시켜준다. (이때, i가 보드판의 length가 되거나 n이 4가 될 경우에는 while문을 탈출해준다. (n을 4까지만 확인하는 이유는 AAAA, BB 중 하나로 값을 결정해주어야 하는데 "X"가 6개, 8개인 경우를 고려하지 않고 최대 4개씩까지만 고려해주기 위해서이다. (4번 참고)))
  3. n이 2보다 크고 2로 나눈 나머지가 0이 아닐 경우 answer를 -1로 바꾸고 해당 연산을 중단하고 -1를 출력한다.
  4. n이 2보다 크고 2로 나눈 나머지가 0일 경우에 추가적으로 n이 4 이상인 경우 answer에 AAAA를 더해주고, 아닐 경우 answer에 BB를 더해준다. (이 방법이 가능한 이유는 3번 때문이다. 만약 "XXXXX"였을 경우, n이 4가 될 때 break를 하여 "XXXX"까지만 검사하고 "AAAA"로 변환하고, "X"를 검사하게 되는데 "X"가 2이상이 아니므로 기존 변환된 값을 -1로 바꿔주기 때문이다. 즉, 4개까지만 검사해도 이후에 문제가 있으면 알아서 연산을 중단하기 때문에 n을 최대 4까지만 검사해도 문제가 되지 않는다.)
  5. 해당 연산을 반복하여 보드판 전체를 다 확인한 뒤 answer를 출력해준다.

코드

var fs = require('fs');
var input = fs.readFileSync('/dev/stdin').toString().trim();

let answer = '';
let n = 0;
for (let i = 0; i < input.length; ) {
  n = 0;
  if (input.charAt(i) === '.') {
    answer += '.';
    i++;
  } else {
    while (true) {
      if (input.charAt(i) === '.' || i === input.length) break;
      if (n === 4) break;
      n++;
      i++;
    }
    if (n >= 2 && n % 2 === 0) {
      if (n - 4 >= 0) {
        answer += 'AAAA';
      } else {
        answer += 'BB';
      }
    } else {
      answer = '-1';
      break;
    }
  }
}

console.log(answer);

회고

문제가 어려운 건 아니였지만, 알고리즘을 잘 짠 것 같아서 기록하는 문제

profile
Frontend🍓

0개의 댓글