페블_
반짝이는 시냅스
페블_
전체 방문자
오늘
어제
  • 전체글 보기 (96)
    • QA (0)
    • 프로젝트 회고 (4)
    • 프로젝트 과정 기록 (12)
    • UI 구현 연구일지 (8)
    • Front-end (31)
      • Javascript (7)
      • CSS (10)
      • React (5)
      • Typescript (3)
      • Nextjs (3)
      • 스타일링 라이브러리 (3)
    • Back-end (0)
      • Express (0)
      • DB (0)
    • CS (0)
      • 자료구조 & 알고리즘 (0)
    • CI&CD (1)
    • 툴 사용법 (4)
      • Git (1)
      • Library&패키지 (2)
      • 기타 개발관련 (1)
    • 알고리즘 이론 & 풀이 (36)
      • 백준(BOJ) (14)
      • 프로그래머스 (22)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 시리즈_표지
  • react
  • 생각
  • 선형대수학
  • storybook
  • chartjs
  • Python
  • JS
  • TypeScript
  • 개발블로그_시작
  • eslint
  • emotion
  • 알고리즘
  • 파이썬
  • 토이프로젝트
  • UI 컴포넌트
  • 캐러셀
  • 백준

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
페블_

반짝이는 시냅스

알고리즘 이론 & 풀이/백준(BOJ)

[백준] 1343번 - 폴리오미노 (nodejs)

2024. 2. 18. 22:10

문제

 

1343번: 폴리오미노

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

www.acmicpc.net

 

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

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

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

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

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

 

 

풀이

검색해보면 replace를 이용해 푼 풀이가 많이 보인다.

하지만 문제의 카테고리가 그리디인 만큼 취지에 맞는 방식으로 풀어보았다.

 

먼저 블럭은 'AAAA' 네 개 짜리와 'BB' 두 개짜리 블럭으로 이루어져 있다.

연속된 X가 홀수인지, 짝수이면 4로 나누어 몫이 몇개고 나머지가 2인지를 이용해 -1 반환 여부와 AAAA와 BB가 몇 개 필요한지 정할 수 있을 것이다.

 

for문으로 검사해서 str[i]번째 문자열이

1) X라면 count++

2) 점을 만나면

- count가 홀수라면 return -1

- 이전까지 셌던 count를 4로 나눈 몫을 구하고 그만큼 AAAA를 repeat,
  4로 나눈 나머지가 2라면 BB를 추가, 마지막으로 점을 더하고, 최종 문자열을 result 배열에 push

- count = 0으로 초기화

 

마무리로 .을 못만나고 count를 센 채로 끝났을 때를 대비해 for문 바깥에서도 같은 작업을 해준다.

 

그리고 result를 join해서 출력

 

💻 코드

const fs = require('fs');
const str = fs.readFileSync('./input.txt').toString().trim();

function solution() {
  const result = [];
  let count = 0;

  for (let i = 0; i < str.length; i++) {
    if (str[i] === '.') {
      if (count % 2 !== 0) return -1;
      const Acount = Math.floor(count / 4);
      const Bcount = count % 4;
      const chunk = 'AAAA'.repeat(Acount) + 'B'.repeat(Bcount) + '.';
      result.push(chunk);
      count = 0;
    } else {
      count++;
    }
  }

  if (count % 2 !== 0) return -1;
  const Acount = Math.floor(count / 4);
  const Bcount = count % 4;
  const chunk = 'AAAA'.repeat(Acount) + 'B'.repeat(Bcount);
  result.push(chunk);

  return result.join('');
}

console.log(solution());

'알고리즘 이론 & 풀이 > 백준(BOJ)' 카테고리의 다른 글

[백준] 2193번 - 이친수 (nodejs)  (1) 2023.12.18
[백준] 1010번 - 다리놓기 (nodejs, DP)  (0) 2023.12.11
[백준] 1463번 - 1로 만들기 (nodejs)  (0) 2023.11.30
[백준] 14502번 - 연구소 (nodejs /조합, BFS)  (0) 2023.11.17
[백준] 2468번 - 안전 영역  (2) 2023.11.09
    '알고리즘 이론 & 풀이/백준(BOJ)' 카테고리의 다른 글
    • [백준] 2193번 - 이친수 (nodejs)
    • [백준] 1010번 - 다리놓기 (nodejs, DP)
    • [백준] 1463번 - 1로 만들기 (nodejs)
    • [백준] 14502번 - 연구소 (nodejs /조합, BFS)
    페블_
    페블_

    티스토리툴바